2 Commits

Author SHA1 Message Date
f6966a2f78 Лабораторная 2 2024-12-22 17:03:53 +04:00
b8929bf9eb Лабараторная 1 2024-12-20 09:27:19 +04:00
63 changed files with 6592 additions and 52 deletions

View File

@@ -0,0 +1,24 @@
namespace ProjectSellPC.Entites
{
public class Cheque
{
public int Id { get; set; }
public List<ProductInCheque> Products { get; set; }
public Client Client { get; set; }
[System.ComponentModel.Browsable(false)]
public int ClientId { get; set; }
public DateTime PurchaseDate { get; set; }
public static Cheque CreateEntity(int id, List<ProductInCheque> products, Client client, DateTime purchaseDate)
{
return new Cheque
{
Id = id,
Products = products,
Client = client,
PurchaseDate = purchaseDate
};
}
}
}

View File

@@ -0,0 +1,33 @@
using ProjectSellPC.Entites.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectSellPC.Entites
{
public class Client
{
public int Id { get; set; }
public string Name { get; set; }
public string PhoneNumber { get; set; }
public ClientType ClientType { get; set; }
public static Client CreateEntity(int id, string name, string phoneNumber, ClientType clientType)
{
return new Client
{
Id = id,
Name = name,
PhoneNumber = phoneNumber,
ClientType = clientType
};
}
public override string ToString()
{
return Name;
}
}
}

View File

@@ -0,0 +1,9 @@
namespace ProjectSellPC.Entites.Enums
{
public enum ClientType
{
None = 0,
Individual = 1,
Business = 2
}
}

View File

@@ -0,0 +1,17 @@
namespace ProjectSellPC.Entites.Enums
{
[Flags]
public enum ProductType
{
None = 0,
Laptop = 1,
Desktop = 2, // Настольный компьютер
Monitor = 4, // Монитор
Keyboard = 8, // Клавиатура
Mouse = 16, // Мышь
Headset = 32, // Наушники
Webcam = 64, // Веб-камера
Printer = 128, // Принтер
Software = 256 // Программное обеспечение
}
}

View File

@@ -0,0 +1,26 @@
using ProjectSellPC.Entites.Enums;
namespace ProjectSellPC.Entites
{
public class Product
{
public int ID { get; private set; }
public string Name { get; private set; }
public string Description { get; private set; }
public decimal Price { get; private set; }
public ProductType ProductType { get; private set; }
public static Product CreateEntity(int id, string name, string desc, decimal price, ProductType productType)
{
return new Product { ID = id,
Name = name ?? string.Empty,
Description = desc ?? string.Empty,
Price = price,
ProductType = productType };
}
public override string ToString()
{
return Name;
}
}
}

View File

@@ -0,0 +1,21 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectSellPC.Entites
{
public class ProductInCheque
{
public int ID { get; set; }
//отредактировать базу данных!!!!!!!
public int ProductID { get; set; }
public int ChequeID { get; set; }
public int Count { get; set; }
public static ProductInCheque CreateElement(int id, int count)
{
return new ProductInCheque { ProductID = id, Count = count };
}
}
}

View File

@@ -0,0 +1,24 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectSellPC.Entites
{
public class ProductsOnWarehouse
{
public int Id { get; set; }
[System.ComponentModel.Browsable(false)]
public int ProductId { get; set; }
public Product Product { get; set; }
[System.ComponentModel.Browsable(false)]
public int WarehouseId { get; set; }
public Warehouse Warehouse { get; set; }
public int Count { get; set; }
public static ProductsOnWarehouse CreateEntity(int id, Product product, Warehouse Warehouse, int count)
{
return new ProductsOnWarehouse { Warehouse = Warehouse, Id = id, Product = product, Count = count };
}
}
}

View File

@@ -0,0 +1,25 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace ProjectSellPC.Entites
{
public class Warehouse
{
public int Id { get; set; }
public int Size { get; set; } // Вместимость
public string Adress { get; set; }
public static Warehouse CreateEntity(int id, int size, string adress)
{
return new Warehouse { Id = id, Size = size, Adress = adress };
}
public override string ToString()
{
return Adress;
}
}
}

View File

@@ -1,39 +0,0 @@
namespace ProjectSellPC
{
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 ProjectSellPC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@@ -0,0 +1,77 @@
namespace ProjectSellPC.Forms.Receipt
{
partial class ChequeForm
{
/// <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()
{
addButton = new Button();
ChequesDataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)ChequesDataGridView).BeginInit();
SuspendLayout();
//
// addButton
//
addButton.BackColor = SystemColors.Control;
addButton.Location = new Point(878, 12);
addButton.Name = "addButton";
addButton.Size = new Size(161, 60);
addButton.TabIndex = 3;
addButton.Text = "Добавить";
addButton.UseVisualStyleBackColor = false;
addButton.Click += addButton_Click;
//
// ChequesDataGridView
//
ChequesDataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
ChequesDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
ChequesDataGridView.Location = new Point(12, 12);
ChequesDataGridView.Name = "ChequesDataGridView";
ChequesDataGridView.RowHeadersWidth = 51;
ChequesDataGridView.Size = new Size(851, 399);
ChequesDataGridView.TabIndex = 2;
//
// ChequeForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1056, 450);
Controls.Add(addButton);
Controls.Add(ChequesDataGridView);
Name = "ChequeForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Чеки";
Load += ChequeForm_Load;
((System.ComponentModel.ISupportInitialize)ChequesDataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button addButton;
private DataGridView ChequesDataGridView;
}
}

View File

@@ -0,0 +1,55 @@
using ProjectSellPC.Repos;
using Unity;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectSellPC.Forms.Receipt
{
public partial class ChequeForm : Form
{
private readonly IUnityContainer _container;
private readonly IChequeRepository _ChequeRepository;
public ChequeForm(IUnityContainer unityContainer, IChequeRepository ChequeRepository)
{
InitializeComponent();
_container = unityContainer ?? throw new ArgumentNullException(nameof(unityContainer));
_ChequeRepository = ChequeRepository ?? throw new ArgumentNullException(nameof(ChequeRepository));
}
private void ChequeForm_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => ChequesDataGridView.DataSource = _ChequeRepository.ReadAll();
private void addButton_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<ChequeSettingsForm>().ShowDialog();
LoadList();
}
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,134 @@
namespace ProjectSellPC.Forms.Receipt
{
partial class ChequeSettingsForm
{
/// <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()
{
customerComboBox = new ComboBox();
label1 = new Label();
saveButton = new Button();
label4 = new Label();
productsDataGridView = new DataGridView();
ProductColoumn = new DataGridViewComboBoxColumn();
ProductCount = new DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)productsDataGridView).BeginInit();
SuspendLayout();
//
// customerComboBox
//
customerComboBox.FormattingEnabled = true;
customerComboBox.Location = new Point(152, 6);
customerComboBox.Name = "customerComboBox";
customerComboBox.Size = new Size(151, 28);
customerComboBox.TabIndex = 18;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(12, 9);
label1.Name = "label1";
label1.Size = new Size(97, 20);
label1.TabIndex = 17;
label1.Text = "Покупатель: ";
//
// saveButton
//
saveButton.Anchor = AnchorStyles.Bottom;
saveButton.Location = new Point(125, 297);
saveButton.Name = "saveButton";
saveButton.Size = new Size(94, 29);
saveButton.TabIndex = 19;
saveButton.Text = "Сохранить";
saveButton.UseVisualStyleBackColor = true;
saveButton.Click += saveButton_Click;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(12, 44);
label4.Name = "label4";
label4.Size = new Size(54, 20);
label4.TabIndex = 15;
label4.Text = "Товар:";
//
// productsDataGridView
//
productsDataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
productsDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
productsDataGridView.Columns.AddRange(new DataGridViewColumn[] { ProductColoumn, ProductCount });
productsDataGridView.Location = new Point(12, 67);
productsDataGridView.Name = "productsDataGridView";
productsDataGridView.RowHeadersWidth = 51;
productsDataGridView.Size = new Size(336, 224);
productsDataGridView.TabIndex = 20;
//
// ProductColoumn
//
ProductColoumn.HeaderText = "Товары";
ProductColoumn.MinimumWidth = 6;
ProductColoumn.Name = "ProductColoumn";
ProductColoumn.Resizable = DataGridViewTriState.True;
ProductColoumn.SortMode = DataGridViewColumnSortMode.Automatic;
ProductColoumn.Width = 125;
//
// ProductCount
//
ProductCount.HeaderText = "Количество";
ProductCount.MinimumWidth = 6;
ProductCount.Name = "ProductCount";
ProductCount.Width = 125;
//
// ChequeSettingsForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(360, 338);
Controls.Add(productsDataGridView);
Controls.Add(saveButton);
Controls.Add(customerComboBox);
Controls.Add(label1);
Controls.Add(label4);
Name = "ChequeSettingsForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Новый чек";
Load += ChequeSettingsForm_Load;
((System.ComponentModel.ISupportInitialize)productsDataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox customerComboBox;
private Label label1;
private Button saveButton;
private Label label4;
private DataGridView productsDataGridView;
private DataGridViewComboBoxColumn ProductColoumn;
private DataGridViewTextBoxColumn ProductCount;
}
}

View File

@@ -0,0 +1,83 @@
using ProjectSellPC.Entites;
using ProjectSellPC.Repos;
using ProjectSellPC.Entites.Enums;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectSellPC.Forms.Receipt
{
public partial class ChequeSettingsForm : Form
{
private readonly IChequeRepository _ChequeRepository;
private readonly IProductRepository _productRepository;
private readonly IClientRepository _customerRepository;
public ChequeSettingsForm(IChequeRepository ChequeRepository, IProductRepository productRepository, IClientRepository customerRepository)
{
InitializeComponent();
_ChequeRepository = ChequeRepository ?? throw new ArgumentNullException(nameof(ChequeRepository));
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
_customerRepository = customerRepository ?? throw new ArgumentNullException(nameof(customerRepository));
ProductColoumn.DataSource = _productRepository.ReadAll().ToList();
ProductColoumn.DisplayMember = "Name";
ProductColoumn.ValueMember = "Id";
customerComboBox.DataSource = _customerRepository.ReadAll().ToList();
customerComboBox.DisplayMember = "Name";
customerComboBox.ValueMember = "Id";
}
public void ChequeSettingsForm_Load(object sender, EventArgs e)
{
}
private void saveButton_Click(object sender, EventArgs e)
{
try
{
if (productsDataGridView.RowCount < 1 || customerComboBox.SelectedItem == null)
{
throw new Exception("Необходимо выбрать товар и клиента");
}
var products = CreateListProducts();
var customer = (Client)customerComboBox.SelectedItem;
var cheque = Cheque.CreateEntity(0, products, customer, DateTime.Now);
_ChequeRepository.Create(cheque);
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при создании чека", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private List<ProductInCheque> CreateListProducts()
{
var list = new List<ProductInCheque>();
foreach (DataGridViewRow row in productsDataGridView.Rows)
{
if (row.Cells["ProductColoumn"].Value == null || row.Cells["ProductCount"].Value == null)
{
continue;
}
list.Add(ProductInCheque.CreateElement(Convert.ToInt32(row.Cells["ProductColoumn"].Value), Convert.ToInt32(row.Cells["ProductCount"].Value)));
}
return list;
}
}
}

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="ProductColoumn.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ProductCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -0,0 +1,103 @@
namespace ProjectSellPC.Forms
{
partial class ClientForm
{
/// <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()
{
deleteButton = new Button();
editButton = new Button();
addButton = new Button();
productsDataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)productsDataGridView).BeginInit();
SuspendLayout();
//
// deleteButton
//
deleteButton.Location = new Point(869, 144);
deleteButton.Name = "deleteButton";
deleteButton.Size = new Size(161, 60);
deleteButton.TabIndex = 7;
deleteButton.Text = "Удалить";
deleteButton.UseVisualStyleBackColor = true;
deleteButton.Click += deleteButton_Click;
//
// editButton
//
editButton.Location = new Point(869, 78);
editButton.Name = "editButton";
editButton.Size = new Size(161, 60);
editButton.TabIndex = 6;
editButton.Text = "Редактировать";
editButton.UseVisualStyleBackColor = true;
editButton.Click += editButton_Click;
//
// addButton
//
addButton.BackColor = SystemColors.Control;
addButton.Location = new Point(869, 12);
addButton.Name = "addButton";
addButton.Size = new Size(161, 60);
addButton.TabIndex = 5;
addButton.Text = "Добавить";
addButton.UseVisualStyleBackColor = false;
addButton.Click += addButton_Click;
//
// productsDataGridView
//
productsDataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
productsDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
productsDataGridView.Location = new Point(12, 12);
productsDataGridView.Name = "productsDataGridView";
productsDataGridView.RowHeadersWidth = 51;
productsDataGridView.Size = new Size(851, 400);
productsDataGridView.TabIndex = 4;
//
// ClientForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1056, 424);
Controls.Add(deleteButton);
Controls.Add(editButton);
Controls.Add(addButton);
Controls.Add(productsDataGridView);
Name = "ClientForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Клиенты";
Load += ClientForm_Load;
((System.ComponentModel.ISupportInitialize)productsDataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button deleteButton;
private Button editButton;
private Button addButton;
private DataGridView productsDataGridView;
}
}

View File

@@ -0,0 +1,111 @@
using ProjectSellPC.Forms.Clients;
using ProjectSellPC.Repos;
using Unity;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectSellPC.Forms
{
public partial class ClientForm : Form
{
private readonly IUnityContainer _container;
private readonly IClientRepository _repository;
public ClientForm(IUnityContainer unityContainer, IClientRepository clientRepository)
{
InitializeComponent();
_container = unityContainer ?? throw new ArgumentNullException(nameof(unityContainer));
_repository = clientRepository ?? throw new ArgumentNullException(nameof(_repository));
}
private void ClientForm_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => productsDataGridView.DataSource = _repository.ReadAll();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (productsDataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(productsDataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
private void addButton_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<ClientFormSettings>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void editButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<ClientFormSettings>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_repository.Delete(findId);
LoadList();
}
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,133 @@
namespace ProjectSellPC.Forms.Clients
{
partial class ClientFormSettings
{
/// <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();
label1 = new Label();
nameTextbox = new TextBox();
saveButton = new Button();
phoneNumberTextbox = new TextBox();
typeCombobox = new ComboBox();
label4 = new Label();
SuspendLayout();
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(13, 59);
label2.Name = "label2";
label2.Size = new Size(130, 20);
label2.TabIndex = 13;
label2.Text = "Номер телефона:";
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(13, 12);
label1.Name = "label1";
label1.Size = new Size(122, 20);
label1.TabIndex = 11;
label1.Text = "Имя покупателя";
//
// nameTextbox
//
nameTextbox.Location = new Point(153, 12);
nameTextbox.Name = "nameTextbox";
nameTextbox.Size = new Size(210, 27);
nameTextbox.TabIndex = 10;
//
// saveButton
//
saveButton.Anchor = AnchorStyles.Bottom;
saveButton.Location = new Point(153, 229);
saveButton.Name = "saveButton";
saveButton.Size = new Size(94, 29);
saveButton.TabIndex = 9;
saveButton.Text = "Сохранить";
saveButton.UseVisualStyleBackColor = true;
saveButton.Click += saveButton_Click;
//
// phoneNumberTextbox
//
phoneNumberTextbox.Location = new Point(153, 59);
phoneNumberTextbox.Name = "phoneNumberTextbox";
phoneNumberTextbox.Size = new Size(210, 27);
phoneNumberTextbox.TabIndex = 18;
//
// typeCombobox
//
typeCombobox.FormattingEnabled = true;
typeCombobox.Location = new Point(153, 101);
typeCombobox.Name = "typeCombobox";
typeCombobox.Size = new Size(151, 28);
typeCombobox.TabIndex = 20;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(13, 104);
label4.Name = "label4";
label4.Size = new Size(38, 20);
label4.TabIndex = 19;
label4.Text = "Вид:";
//
// ClientFormSettings
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(388, 270);
Controls.Add(typeCombobox);
Controls.Add(label4);
Controls.Add(phoneNumberTextbox);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(nameTextbox);
Controls.Add(saveButton);
Name = "ClientFormSettings";
StartPosition = FormStartPosition.CenterScreen;
Text = "Регистрация клиента";
Load += ClientFormSettings_Load;
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox typeCombobox;
private Label label4;
private Label label3;
private NumericUpDown priceNumeric;
private Label label2;
private TextBox descriptionTextbox;
private Label label1;
private TextBox nameTextbox;
private Button saveButton;
private TextBox phoneNumberTextbox;
}
}

View File

@@ -0,0 +1,96 @@
using ProjectSellPC.Entites.Enums;
using ProjectSellPC.Entites;
using ProjectSellPC.Repos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectSellPC.Forms.Clients
{
public partial class ClientFormSettings : Form
{
private readonly IClientRepository _repository;
private int? _clientId;
public int Id
{
set
{
try
{
var client = _repository.Read(value);
if (client == null)
{
throw new InvalidDataException(nameof(client));
}
nameTextbox.Text = client.Name;
phoneNumberTextbox.Text = client.PhoneNumber;
typeCombobox.SelectedItem = client.ClientType;
_clientId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public ClientFormSettings(IClientRepository clientRepository)
{
InitializeComponent();
_repository = clientRepository ?? throw new ArgumentNullException(nameof(clientRepository));
typeCombobox.DataSource = Enum.GetValues(typeof(ClientType));
}
private void ClientFormSettings_Load(object sender, EventArgs e)
{
}
private void saveButton_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(nameTextbox.Text) ||
string.IsNullOrWhiteSpace(phoneNumberTextbox.Text) || typeCombobox.SelectedIndex < 1
|| typeCombobox.SelectedIndex < 1)
{
throw new Exception("Имеются незаполненные поля");
}
if (_clientId.HasValue)
{
_repository.Update(CreateClient(_clientId.Value));
}
else
{
_repository.Create(CreateClient(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private Client CreateClient(int id)
{
return Client.CreateEntity(id, nameTextbox.Text, phoneNumberTextbox.Text, (ClientType)typeCombobox.SelectedValue);
}
}
}

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 ProjectSellPC
{
partial class ShopForm
{
/// <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(ShopForm));
menuStrip1 = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
товарыToolStripMenuItem = new ToolStripMenuItem();
клиентыToolStripMenuItem = new ToolStripMenuItem();
складыToolStripMenuItem = new ToolStripMenuItem();
операцииToolStripMenuItem = new ToolStripMenuItem();
товарыНаСкаледToolStripMenuItem = new ToolStripMenuItem();
чекиToolStripMenuItem = new ToolStripMenuItem();
menuStrip1.SuspendLayout();
SuspendLayout();
//
// menuStrip1
//
menuStrip1.ImageScalingSize = new Size(20, 20);
menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Size = new Size(800, 28);
menuStrip1.TabIndex = 0;
menuStrip1.Text = "menuStrip1";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { товарыToolStripMenuItem, клиентыToolStripMenuItem, складыToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(126, 24);
справочникиToolStripMenuItem.Text = "Справочники...";
//
// товарыToolStripMenuItem
//
товарыToolStripMenuItem.Name = оварыToolStripMenuItem";
товарыToolStripMenuItem.Size = new Size(152, 26);
товарыToolStripMenuItem.Text = "Товары";
товарыToolStripMenuItem.Click += товарыToolStripMenuItem_Click;
//
// клиентыToolStripMenuItem
//
клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem";
клиентыToolStripMenuItem.Size = new Size(152, 26);
клиентыToolStripMenuItem.Text = "Клиенты";
клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click;
//
// складыToolStripMenuItem
//
складыToolStripMenuItem.Name = "складыToolStripMenuItem";
складыToolStripMenuItem.Size = new Size(152, 26);
складыToolStripMenuItem.Text = "Склады";
складыToolStripMenuItem.Click += складыToolStripMenuItem_Click;
//
// операцииToolStripMenuItem
//
операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { товарыНаСкаледToolStripMenuItem, чекиToolStripMenuItem });
операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
операцииToolStripMenuItem.Size = new Size(104, 24);
операцииToolStripMenuItem.Text = "Операции...";
//
// товарыНаСкаледToolStripMenuItem
//
товарыНаСкаледToolStripMenuItem.Name = оварыНаСкаледToolStripMenuItem";
товарыНаСкаледToolStripMenuItem.Size = new Size(216, 26);
товарыНаСкаледToolStripMenuItem.Text = "Товары на складе";
товарыНаСкаледToolStripMenuItem.Click += товарыНаСкаледToolStripMenuItem_Click;
//
// чекиToolStripMenuItem
//
чекиToolStripMenuItem.Name = екиToolStripMenuItem";
чекиToolStripMenuItem.Size = new Size(216, 26);
чекиToolStripMenuItem.Text = "Чеки...";
чекиToolStripMenuItem.Click += чекиToolStripMenuItem_Click;
//
// ShopForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackgroundImage = (Image)resources.GetObject("$this.BackgroundImage");
BackgroundImageLayout = ImageLayout.Stretch;
ClientSize = new Size(800, 450);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
Name = "ShopForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Магазин компьютерной техники";
Load += ShopForm_Load;
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip1;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem товарыToolStripMenuItem;
private ToolStripMenuItem клиентыToolStripMenuItem;
private ToolStripMenuItem складыToolStripMenuItem;
private ToolStripMenuItem операцииToolStripMenuItem;
private ToolStripMenuItem товарыНаСкаледToolStripMenuItem;
private ToolStripMenuItem чекиToolStripMenuItem;
}
}

View File

@@ -0,0 +1,53 @@
using ProjectSellPC.Forms;
using ProjectSellPC.Forms.ProductsOnWarehouse;
using ProjectSellPC.Forms.Receipt;
using ProjectSellPC.Forms.Warehouse;
using Unity;
namespace ProjectSellPC
{
public partial class ShopForm : Form
{
private readonly IUnityContainer _container;
public ShopForm(IUnityContainer container)
{
InitializeComponent();
_container = container ?? throw new ArgumentNullException(nameof(container));
}
private void <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ToolStripMenuItem_Click(object sender, EventArgs e)
{
_container.Resolve<ProductForm>().ShowDialog();
}
private void <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ToolStripMenuItem_Click(object sender, EventArgs e)
{
_container.Resolve<ClientForm>().ShowDialog();
}
private void <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ToolStripMenuItem_Click(object sender, EventArgs e)
{
_container.Resolve<WarehouseForm>().ShowDialog();
}
private void <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ToolStripMenuItem_Click(object sender, EventArgs e)
{
_container.Resolve<ProductsOnWarehouseForm>().ShowDialog();
}
private void <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ToolStripMenuItem_Click(object sender, EventArgs e)
{
_container.Resolve<ChequeForm>().ShowDialog();
}
private void ShopForm_Load(object sender, EventArgs e)
{
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,103 @@
namespace ProjectSellPC
{
partial class ProductForm
{
/// <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()
{
productsDataGridView = new DataGridView();
addButton = new Button();
editButton = new Button();
deleteButton = new Button();
((System.ComponentModel.ISupportInitialize)productsDataGridView).BeginInit();
SuspendLayout();
//
// productsDataGridView
//
productsDataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
productsDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
productsDataGridView.Location = new Point(12, 12);
productsDataGridView.Name = "productsDataGridView";
productsDataGridView.RowHeadersWidth = 51;
productsDataGridView.Size = new Size(851, 399);
productsDataGridView.TabIndex = 0;
//
// addButton
//
addButton.BackColor = SystemColors.Control;
addButton.Location = new Point(878, 12);
addButton.Name = "addButton";
addButton.Size = new Size(161, 60);
addButton.TabIndex = 1;
addButton.Text = "Добавить";
addButton.UseVisualStyleBackColor = false;
addButton.Click += addButton_Click;
//
// editButton
//
editButton.Location = new Point(878, 87);
editButton.Name = "editButton";
editButton.Size = new Size(161, 60);
editButton.TabIndex = 2;
editButton.Text = "Редактировать";
editButton.UseVisualStyleBackColor = true;
editButton.Click += editButton_Click;
//
// deleteButton
//
deleteButton.Location = new Point(878, 163);
deleteButton.Name = "deleteButton";
deleteButton.Size = new Size(161, 60);
deleteButton.TabIndex = 3;
deleteButton.Text = "Удалить";
deleteButton.UseVisualStyleBackColor = true;
deleteButton.Click += deleteButton_Click;
//
// ProductForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1051, 423);
Controls.Add(deleteButton);
Controls.Add(editButton);
Controls.Add(addButton);
Controls.Add(productsDataGridView);
Name = "ProductForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Товары";
Load += ProductForm_Load;
((System.ComponentModel.ISupportInitialize)productsDataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private DataGridView productsDataGridView;
private Button addButton;
private Button editButton;
private Button deleteButton;
}
}

View File

@@ -0,0 +1,110 @@
using ProjectSellPC.Repos;
using Unity;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectSellPC
{
public partial class ProductForm : Form
{
private readonly IUnityContainer _container;
private readonly IProductRepository _productRepository;
public ProductForm(IUnityContainer unityContainer, IProductRepository productRepository)
{
InitializeComponent();
_container = unityContainer ?? throw new ArgumentNullException(nameof(unityContainer));
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(_productRepository));
}
private void ProductForm_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => productsDataGridView.DataSource = _productRepository.ReadAll();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (productsDataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(productsDataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
private void addButton_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<ProductSettingsForm>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void editButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<ProductSettingsForm>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_productRepository.Delete(findId);
LoadList();
}
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,157 @@
namespace ProjectSellPC
{
partial class ProductSettingsForm
{
/// <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()
{
saveButton = new Button();
productNameTextbox = new TextBox();
label1 = new Label();
label2 = new Label();
descriptionTextbox = new TextBox();
priceNumeric = new NumericUpDown();
label3 = new Label();
label4 = new Label();
typeChequeedListBox = new CheckedListBox();
((System.ComponentModel.ISupportInitialize)priceNumeric).BeginInit();
SuspendLayout();
//
// saveButton
//
saveButton.Anchor = AnchorStyles.Bottom;
saveButton.Location = new Point(157, 436);
saveButton.Name = "saveButton";
saveButton.Size = new Size(94, 29);
saveButton.TabIndex = 0;
saveButton.Text = "Сохранить";
saveButton.UseVisualStyleBackColor = true;
saveButton.Click += saveButton_Click;
//
// productNameTextbox
//
productNameTextbox.Location = new Point(152, 36);
productNameTextbox.Name = "productNameTextbox";
productNameTextbox.Size = new Size(210, 27);
productNameTextbox.TabIndex = 1;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(12, 36);
label1.Name = "label1";
label1.Size = new Size(94, 20);
label1.TabIndex = 2;
label1.Text = "Имя товара:";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(12, 83);
label2.Name = "label2";
label2.Size = new Size(134, 20);
label2.TabIndex = 4;
label2.Text = "Описание товара:";
//
// descriptionTextbox
//
descriptionTextbox.Location = new Point(152, 83);
descriptionTextbox.Multiline = true;
descriptionTextbox.Name = "descriptionTextbox";
descriptionTextbox.Size = new Size(210, 132);
descriptionTextbox.TabIndex = 3;
//
// priceNumeric
//
priceNumeric.DecimalPlaces = 2;
priceNumeric.Location = new Point(152, 233);
priceNumeric.Name = "priceNumeric";
priceNumeric.Size = new Size(99, 27);
priceNumeric.TabIndex = 5;
priceNumeric.ThousandsSeparator = true;
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(12, 235);
label3.Name = "label3";
label3.Size = new Size(48, 20);
label3.TabIndex = 6;
label3.Text = "Цена:";
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(12, 285);
label4.Name = "label4";
label4.Size = new Size(38, 20);
label4.TabIndex = 7;
label4.Text = "Вид:";
//
// typeChequeedListBox
//
typeChequeedListBox.FormattingEnabled = true;
typeChequeedListBox.Location = new Point(152, 285);
typeChequeedListBox.Name = "typeChequeedListBox";
typeChequeedListBox.Size = new Size(150, 114);
typeChequeedListBox.TabIndex = 8;
//
// ProductSettingsForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(409, 477);
Controls.Add(typeChequeedListBox);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(priceNumeric);
Controls.Add(label2);
Controls.Add(descriptionTextbox);
Controls.Add(label1);
Controls.Add(productNameTextbox);
Controls.Add(saveButton);
Name = "ProductSettingsForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Настройка товара...";
Load += ProductSettingsForm_Load;
((System.ComponentModel.ISupportInitialize)priceNumeric).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button saveButton;
private TextBox productNameTextbox;
private Label label1;
private Label label2;
private TextBox descriptionTextbox;
private NumericUpDown priceNumeric;
private Label label3;
private Label label4;
private CheckedListBox typeChequeedListBox;
}
}

View File

@@ -0,0 +1,107 @@
using ProjectSellPC.Entites;
using ProjectSellPC.Entites.Enums;
using ProjectSellPC.Repos;
using Microsoft.VisualBasic.FileIO;
using System;
using System.Windows.Forms;
namespace ProjectSellPC
{
public partial class ProductSettingsForm : Form
{
private readonly IProductRepository _productRepository;
private int? _productId;
public int Id
{
set
{
try
{
var product = _productRepository.Read(value);
if (product == null)
{
throw new InvalidDataException(nameof(product));
}
productNameTextbox.Text = product.Name;
descriptionTextbox.Text = product.Description;
foreach (ProductType elem in Enum.GetValues(typeof(ProductType)))
{
if ((elem & product.ProductType) != 0)
{
typeChequeedListBox.SetItemChecked(typeChequeedListBox.Items.IndexOf(elem), true);
}
}
priceNumeric.Value = product.Price;
_productId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public ProductSettingsForm(IProductRepository productRepository)
{
InitializeComponent();
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
foreach (var elem in Enum.GetValues(typeof(ProductType)))
{
typeChequeedListBox.Items.Add(elem);
}
}
private void ProductSettingsForm_Load(object sender, EventArgs e)
{
}
private void saveButton_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(productNameTextbox.Text) ||
string.IsNullOrWhiteSpace(descriptionTextbox.Text) || typeChequeedListBox.CheckedItems.Count == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_productId.HasValue)
{
_productRepository.Update(CreateProduct(_productId.Value));
}
else
{
_productRepository.Create(CreateProduct(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private Product CreateProduct(int id)
{
ProductType type = ProductType.None;
foreach (var elem in typeChequeedListBox.CheckedItems)
{
type |= (ProductType)elem;
}
return Product.CreateEntity(id, productNameTextbox.Text, descriptionTextbox.Text, priceNumeric.Value, type);
}
}
}

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,81 @@
namespace ProjectSellPC.Forms.ProductsOnWarehouse
{
partial class ProductsOnWarehouseForm
{
/// <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()
{
addButton = new Button();
productsDataGridView = new DataGridView();
editButton = new Button();
((System.ComponentModel.ISupportInitialize)productsDataGridView).BeginInit();
SuspendLayout();
//
// addButton
//
addButton.BackColor = SystemColors.Control;
addButton.Location = new Point(881, 12);
addButton.Name = "addButton";
addButton.Size = new Size(161, 60);
addButton.TabIndex = 9;
addButton.Text = "Добавить";
addButton.UseVisualStyleBackColor = false;
addButton.Click += addButton_Click;
//
// productsDataGridView
//
productsDataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
productsDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
productsDataGridView.Location = new Point(12, 12);
productsDataGridView.Name = "productsDataGridView";
productsDataGridView.RowHeadersWidth = 51;
productsDataGridView.Size = new Size(851, 400);
productsDataGridView.TabIndex = 8;
//
// ProductsOnWarehouseForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1064, 450);
Controls.Add(editButton);
Controls.Add(addButton);
Controls.Add(productsDataGridView);
Name = "ProductsOnWarehouseForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Товары на складе";
Load += ProductsOnWarehouse_Load;
((System.ComponentModel.ISupportInitialize)productsDataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button addButton;
private DataGridView productsDataGridView;
private Button editButton;
}
}

View File

@@ -0,0 +1,99 @@
using ProjectSellPC.Repos;
using Unity;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//ТУТ ПРОБЛЕМЫ С КНОПКОЙ РЕДАКТИРОВАТЬ, ТАК КАК ЕЁ НАДО ПОМЕНЯТЬ!!!!!!!!!
namespace ProjectSellPC.Forms.ProductsOnWarehouse
{
public partial class ProductsOnWarehouseForm : Form
{
private readonly IUnityContainer _container;
private readonly IProductOnWarehouseRepository _productOnWarehouseRepository;
public ProductsOnWarehouseForm(IUnityContainer unityContainer, IProductOnWarehouseRepository productOnWarehouseRepository)
{
InitializeComponent();
_container = unityContainer ?? throw new ArgumentNullException(nameof(unityContainer));
_productOnWarehouseRepository = productOnWarehouseRepository ?? throw new ArgumentNullException(nameof(productOnWarehouseRepository));
}
private void ProductsOnWarehouse_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => productsDataGridView.DataSource = _productOnWarehouseRepository.ReadAll();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (productsDataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(productsDataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
private void addButton_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<ProductsOnWarehouseSettingsForm>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_productOnWarehouseRepository.Delete(findId);
LoadList();
}
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,134 @@
namespace ProjectSellPC.Forms.ProductsOnWarehouse
{
partial class ProductsOnWarehouseSettingsForm
{
/// <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()
{
productCombobox = new ComboBox();
label4 = new Label();
label3 = new Label();
countNumeric = new NumericUpDown();
WarehouseCombobox = new ComboBox();
label1 = new Label();
saveButton = new Button();
((System.ComponentModel.ISupportInitialize)countNumeric).BeginInit();
SuspendLayout();
//
// productCombobox
//
productCombobox.FormattingEnabled = true;
productCombobox.Location = new Point(155, 12);
productCombobox.Name = "productCombobox";
productCombobox.Size = new Size(151, 28);
productCombobox.TabIndex = 12;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(15, 15);
label4.Name = "label4";
label4.Size = new Size(54, 20);
label4.TabIndex = 11;
label4.Text = "Товар:";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(15, 82);
label3.Name = "label3";
label3.Size = new Size(103, 20);
label3.TabIndex = 10;
label3.Text = "В количестве:";
//
// countNumeric
//
countNumeric.Location = new Point(155, 80);
countNumeric.Name = "countNumeric";
countNumeric.Size = new Size(99, 27);
countNumeric.TabIndex = 9;
countNumeric.ThousandsSeparator = true;
//
// WarehouseCombobox
//
WarehouseCombobox.FormattingEnabled = true;
WarehouseCombobox.Location = new Point(155, 46);
WarehouseCombobox.Name = "WarehouseCombobox";
WarehouseCombobox.Size = new Size(151, 28);
WarehouseCombobox.TabIndex = 14;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(15, 49);
label1.Name = "label1";
label1.Size = new Size(81, 20);
label1.TabIndex = 13;
label1.Text = "На складе:";
//
// saveButton
//
saveButton.Anchor = AnchorStyles.Bottom;
saveButton.Location = new Point(155, 175);
saveButton.Name = "saveButton";
saveButton.Size = new Size(94, 29);
saveButton.TabIndex = 15;
saveButton.Text = "Сохранить";
saveButton.UseVisualStyleBackColor = true;
saveButton.Click += saveButton_Click;
//
// ProductsOnWarehouseSettingsForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(411, 216);
Controls.Add(saveButton);
Controls.Add(WarehouseCombobox);
Controls.Add(label1);
Controls.Add(productCombobox);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(countNumeric);
Name = "ProductsOnWarehouseSettingsForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Продукт на складе...";
Load += ProductsOnWarehouseSettingsForm_Load;
((System.ComponentModel.ISupportInitialize)countNumeric).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox productCombobox;
private Label label4;
private Label label3;
private NumericUpDown countNumeric;
private ComboBox WarehouseCombobox;
private Label label1;
private Button saveButton;
}
}

View File

@@ -0,0 +1,114 @@
using ProjectSellPC.Entites;
using ProjectSellPC.Repos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectSellPC.Forms.ProductsOnWarehouse
{
public partial class ProductsOnWarehouseSettingsForm : Form
{
private readonly IProductOnWarehouseRepository _productOnWarehouseRepository;
private readonly IProductRepository _productRepository;
private readonly IWarehouseRepository _WarehouseRepository;
private int? _recordId;
public int Id
{
set
{
try
{
var record = _productOnWarehouseRepository.Read(value);
if (record == null)
{
throw new InvalidDataException("Record not found");
}
//ProductComboBox
foreach (var item in _productRepository.ReadAll())
{
if (item.ID == record.ProductId)
{
productCombobox.SelectedItem = item;
}
}
//WarehouseCombobox
foreach (var item in _WarehouseRepository.ReadAll())
{
if (item.Id == record.WarehouseId)
{
WarehouseCombobox.SelectedItem = item;
}
}
countNumeric.Value = record.Count;
_recordId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public ProductsOnWarehouseSettingsForm(
IProductOnWarehouseRepository productOnWarehouseRepository,
IProductRepository productRepository,
IWarehouseRepository WarehouseRepository)
{
InitializeComponent();
_productOnWarehouseRepository = productOnWarehouseRepository ?? throw new ArgumentNullException(nameof(productOnWarehouseRepository));
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
_WarehouseRepository = WarehouseRepository ?? throw new ArgumentNullException(nameof(WarehouseRepository));
LoadComboboxes();
}
private void ProductsOnWarehouseSettingsForm_Load(object sender, EventArgs e)
{
}
private void LoadComboboxes()
{
productCombobox.DataSource = _productRepository.ReadAll().ToList();
productCombobox.DisplayMember = "Name";
productCombobox.ValueMember = "Id";
WarehouseCombobox.DataSource = _WarehouseRepository.ReadAll().ToList();
WarehouseCombobox.DisplayMember = "Adress";
WarehouseCombobox.ValueMember = "Id";
}
private void saveButton_Click(object sender, EventArgs e)
{
try
{
if (productCombobox.SelectedItem == null || WarehouseCombobox.SelectedItem == null)
{
throw new Exception("Заполните все поля");
}
var selectedProduct = (Product)productCombobox.SelectedItem;
var selectedWarehouse = (Entites.Warehouse)WarehouseCombobox.SelectedItem;
var count = (int)countNumeric.Value;
_productOnWarehouseRepository.Create(CreateProductOnWarehouse(0, selectedProduct, selectedWarehouse, count));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private Entites.ProductsOnWarehouse CreateProductOnWarehouse(int id, Product product, Entites.Warehouse Warehouse, int count)
{
return Entites.ProductsOnWarehouse.CreateEntity(id, product, Warehouse, count);
}
}
}

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 ProjectSellPC.Forms.Warehouse
{
partial class WarehouseForm
{
/// <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()
{
deleteButton = new Button();
editButton = new Button();
addButton = new Button();
WarehousesDataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)WarehousesDataGridView).BeginInit();
SuspendLayout();
//
// deleteButton
//
deleteButton.Location = new Point(869, 144);
deleteButton.Name = "deleteButton";
deleteButton.Size = new Size(161, 60);
deleteButton.TabIndex = 11;
deleteButton.Text = "Удалить";
deleteButton.UseVisualStyleBackColor = true;
deleteButton.Click += deleteButton_Click;
//
// editButton
//
editButton.Location = new Point(869, 78);
editButton.Name = "editButton";
editButton.Size = new Size(161, 60);
editButton.TabIndex = 10;
editButton.Text = "Редактировать";
editButton.UseVisualStyleBackColor = true;
editButton.Click += editButton_Click;
//
// addButton
//
addButton.BackColor = SystemColors.Control;
addButton.Location = new Point(869, 12);
addButton.Name = "addButton";
addButton.Size = new Size(161, 60);
addButton.TabIndex = 9;
addButton.Text = "Добавить";
addButton.UseVisualStyleBackColor = false;
addButton.Click += addButton_Click;
//
// WarehousesDataGridView
//
WarehousesDataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
WarehousesDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
WarehousesDataGridView.Location = new Point(12, 12);
WarehousesDataGridView.Name = "WarehousesDataGridView";
WarehousesDataGridView.RowHeadersWidth = 51;
WarehousesDataGridView.Size = new Size(851, 416);
WarehousesDataGridView.TabIndex = 8;
//
// WarehouseForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1058, 440);
Controls.Add(deleteButton);
Controls.Add(editButton);
Controls.Add(addButton);
Controls.Add(WarehousesDataGridView);
Name = "WarehouseForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Склады";
Load += WarehouseForm_Load;
((System.ComponentModel.ISupportInitialize)WarehousesDataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button deleteButton;
private Button editButton;
private Button addButton;
private DataGridView WarehousesDataGridView;
}
}

View File

@@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ProjectSellPC.Forms.Clients;
using ProjectSellPC.Repos;
using Unity;
namespace ProjectSellPC.Forms.Warehouse
{
public partial class WarehouseForm : Form
{
private readonly IUnityContainer _container;
private readonly IWarehouseRepository _repository;
public WarehouseForm(IUnityContainer unityContainer, IWarehouseRepository repository)
{
InitializeComponent();
_container = unityContainer ?? throw new ArgumentNullException(nameof(unityContainer));
_repository = repository ?? throw new ArgumentNullException(nameof(_repository));
}
private void WarehouseForm_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => WarehousesDataGridView.DataSource = _repository.ReadAll();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (WarehousesDataGridView.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(WarehousesDataGridView.SelectedRows[0].Cells["Id"].Value);
return true;
}
private void addButton_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<WarehouseSettingsForm>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void editButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<WarehouseSettingsForm>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_repository.Delete(findId);
LoadList();
}
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,110 @@
namespace ProjectSellPC.Forms.Warehouse
{
partial class WarehouseSettingsForm
{
/// <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();
sizeNumeric = new NumericUpDown();
label1 = new Label();
adressTextbox = new TextBox();
saveButton = new Button();
((System.ComponentModel.ISupportInitialize)sizeNumeric).BeginInit();
SuspendLayout();
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(12, 67);
label3.Name = "label3";
label3.Size = new Size(100, 20);
label3.TabIndex = 11;
label3.Text = "Вместимость";
//
// sizeNumeric
//
sizeNumeric.Location = new Point(119, 65);
sizeNumeric.Name = "sizeNumeric";
sizeNumeric.Size = new Size(99, 27);
sizeNumeric.TabIndex = 10;
sizeNumeric.ThousandsSeparator = true;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(12, 22);
label1.Name = "label1";
label1.Size = new Size(104, 20);
label1.TabIndex = 9;
label1.Text = "Адрес склада:";
//
// adressTextbox
//
adressTextbox.Location = new Point(119, 19);
adressTextbox.Name = "adressTextbox";
adressTextbox.Size = new Size(210, 27);
adressTextbox.TabIndex = 8;
//
// saveButton
//
saveButton.Anchor = AnchorStyles.Bottom;
saveButton.Location = new Point(129, 117);
saveButton.Name = "saveButton";
saveButton.Size = new Size(94, 29);
saveButton.TabIndex = 7;
saveButton.Text = "Сохранить";
saveButton.UseVisualStyleBackColor = true;
saveButton.Click += saveButton_Click;
//
// WarehouseSettingsForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(364, 158);
Controls.Add(label3);
Controls.Add(sizeNumeric);
Controls.Add(label1);
Controls.Add(adressTextbox);
Controls.Add(saveButton);
Name = "WarehouseSettingsForm";
StartPosition = FormStartPosition.CenterScreen;
Text = "Настройки склада";
Load += WarehouseFormSettings_Load;
((System.ComponentModel.ISupportInitialize)sizeNumeric).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label3;
private NumericUpDown sizeNumeric;
private Label label1;
private TextBox adressTextbox;
private Button saveButton;
}
}

View File

@@ -0,0 +1,92 @@
using ProjectSellPC.Entites.Enums;
using ProjectSellPC.Entites;
using ProjectSellPC.Repos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ProjectSellPC.Repos;
namespace ProjectSellPC.Forms.Warehouse
{
public partial class WarehouseSettingsForm : Form
{
private readonly IWarehouseRepository _repository;
private int? _WarehouseID;
public int Id
{
set
{
try
{
var Warehouse = _repository.Read(value);
if (Warehouse == null)
{
throw new InvalidDataException(nameof(Warehouse));
}
adressTextbox.Text = Warehouse.Adress;
sizeNumeric.Value = Warehouse.Size;
_WarehouseID = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public WarehouseSettingsForm(IWarehouseRepository repository)
{
InitializeComponent();
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
}
private void WarehouseFormSettings_Load(object sender, EventArgs e)
{
}
private void saveButton_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(adressTextbox.Text))
{
throw new Exception("Имеются незаполненные поля");
}
if (_WarehouseID.HasValue)
{
_repository.Update(CreateWarehouse(_WarehouseID.Value));
}
else
{
_repository.Create(CreateWarehouse(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private Entites.Warehouse CreateWarehouse(int id)
{
return Entites.Warehouse.CreateEntity(id, (int)sizeNumeric.Value, adressTextbox.Text);
}
}
}

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

@@ -1,3 +1,11 @@
using ProjectSellPC.Repos;
using ProjectSellPC.Repos.Impements;
using Microsoft.Extensions.Logging;
using Unity;
using Unity.Lifetime;
using Serilog;
using Microsoft.Extensions.Configuration;
namespace ProjectSellPC namespace ProjectSellPC
{ {
internal static class Program internal static class Program
@@ -8,10 +16,36 @@ namespace ProjectSellPC
[STAThread] [STAThread]
static void Main() static void Main()
{ {
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize(); ApplicationConfiguration.Initialize();
Application.Run(new Form1()); Application.Run(CreateContainer().Resolve<ShopForm>());
}
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.RegisterInstance<ILoggerFactory>(CreateLoggerFactory());
container.RegisterType<IConnectionString, ConnectionString>(new SingletonLifetimeManager());
container.RegisterType<IProductRepository, ProductRepo>(new TransientLifetimeManager());
container.RegisterType<IClientRepository, ClientRepo>(new TransientLifetimeManager());
container.RegisterType<IWarehouseRepository, WarehouseRepo>(new TransientLifetimeManager());
container.RegisterType<IProductOnWarehouseRepository, ProductsOnWarehouseRepo>(new TransientLifetimeManager());
container.RegisterType<IProductInChequeRepository, ProductInChequeRepo>(new TransientLifetimeManager());
container.RegisterType<IChequeRepository, ChequeRepo>(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,23 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="Microsoft.Extensions.Configuration" 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="Serilog" Version="4.2.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="9.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Unity" Version="5.11.10" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ProjectSellPC.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("ProjectSellPC.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;
}
}
}
}

View File

@@ -0,0 +1,11 @@
using ProjectSellPC.Entites;
namespace ProjectSellPC.Repos
{
public interface IChequeRepository
{
IEnumerable<Cheque> ReadAll();
Cheque Read(int id);
void Create(Cheque Cheque);
}
}

View File

@@ -0,0 +1,13 @@
using ProjectSellPC.Entites;
namespace ProjectSellPC.Repos
{
public interface IClientRepository
{
IEnumerable<Client> ReadAll();
Client Read(int id);
void Create(Client client);
Client Update(Client client);
void Delete(int id);
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectSellPC.Repos
{
public interface IConnectionString
{
string ConnectionString { get; }
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectSellPC.Entites;
namespace ProjectSellPC.Repos
{
public interface IProductInChequeRepository
{
IEnumerable<ProductInCheque> ReadAll();
ProductInCheque Read(int id);
void Create(ProductInCheque ps);
}
}

View File

@@ -0,0 +1,11 @@
using ProjectSellPC.Entites;
namespace ProjectSellPC.Repos
{
public interface IProductOnWarehouseRepository
{
IEnumerable<ProductsOnWarehouse> ReadAll();
ProductsOnWarehouse Read(int id);
void Create(ProductsOnWarehouse ps);
void Delete(int id);
}
}

View File

@@ -0,0 +1,13 @@
using ProjectSellPC.Entites;
namespace ProjectSellPC.Repos
{
public interface IProductRepository
{
IEnumerable<Product> ReadAll();
Product Read(int id);
void Create(Product product);
Product Update(Product product);
void Delete(int id);
}
}

View File

@@ -0,0 +1,13 @@
using ProjectSellPC.Entites;
namespace ProjectSellPC.Repos
{
public interface IWarehouseRepository
{
IEnumerable<Warehouse> ReadAll();
Warehouse Read(int id);
void Create(Warehouse Warehouse);
Warehouse Update(Warehouse Warehouse);
void Delete(int id);
}
}

View File

@@ -0,0 +1,121 @@
using ProjectSellPC.Entites;
using Dapper;
using Microsoft.Extensions.Logging;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace ProjectSellPC.Repos.Impements
{
public class ChequeRepo : IChequeRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<ChequeRepo> _logger;
private readonly IClientRepository _clientRepository;
public ChequeRepo(IConnectionString connectionString, ILoggerFactory loggerFactory, IClientRepository clientRepository)
{
_connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
_logger = loggerFactory.CreateLogger<ChequeRepo>();
_clientRepository = clientRepository ?? throw new ArgumentNullException(nameof(clientRepository));
}
private IDbConnection CreateConnection() => new NpgsqlConnection(_connectionString.ConnectionString);
public void Create(Cheque Cheque)
{
_logger.LogInformation("Создание чека");
using (var connection = CreateConnection())
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
try
{
var chequeSql = "INSERT INTO \"cheque\" (\"clientid\", \"purchasedate\") VALUES (@ClientId, @PurchaseDate) RETURNING \"id\"";
Cheque.Id = connection.ExecuteScalar<int>(chequeSql, new
{
ClientId = Cheque.Client.Id,
PurchaseDate = Cheque.PurchaseDate
}, transaction);
var productSql = "INSERT INTO \"productsincheque\" (\"chequeid\", \"productid\", \"count\") VALUES (@ChequeId, @ProductID, @Count)";
foreach (var productInCheque in Cheque.Products)
{
connection.Execute(productSql, new
{
ChequeId = Cheque.Id,
ProductID = productInCheque.ProductID,
Count = productInCheque.Count
}, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
_logger.LogError(ex, "Ошибка при создании чека");
throw;
}
}
}
}
public Cheque Read(int id)
{
_logger.LogInformation("Чтение чека по ID: {id}", id);
using (var connection = CreateConnection())
{
try
{
var ChequeSql = "SELECT * FROM \"cheque\" WHERE \"id\" = @Id";
var Cheque = connection.QuerySingleOrDefault<Cheque>(ChequeSql, new { Id = id });
if (Cheque == null) return null;
Cheque.Client = _clientRepository.Read(Cheque.Client.Id);
var productSql = "SELECT * FROM \"productsincheque\" WHERE \"chequeid\" = @ChequeId";
Cheque.Products = connection.Query<ProductInCheque>(productSql, new { ChequeId = Cheque.Id }).ToList();
return Cheque;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении чека");
throw;
}
}
}
public IEnumerable<Cheque> ReadAll()
{
_logger.LogInformation("Чтение всех чеков");
using (var connection = CreateConnection())
{
try
{
var ChequeSql = "SELECT * FROM \"cheque\"";
var Cheques = connection.Query<Cheque>(ChequeSql).ToList();
foreach (var Cheque in Cheques)
{
Cheque.Client = _clientRepository.Read(Cheque.ClientId);
var productSql = "SELECT * FROM \"productsincheque\" WHERE \"chequeeid\" = @ChequeId";
Cheque.Products = connection.Query<ProductInCheque>(productSql, new { ChequeId = Cheque.Id }).ToList();
}
return Cheques;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении всех чеков");
throw;
}
}
}
}
}

View File

@@ -0,0 +1,141 @@
using ProjectSellPC.Entites;
using ProjectSellPC.Entites.Enums;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
namespace ProjectSellPC.Repos.Impements
{
public class ClientRepo : IClientRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<ClientRepo> _logger;
public ClientRepo(IConnectionString connectionString, ILoggerFactory loggerFactory)
{
_connectionString = connectionString;
_logger = loggerFactory.CreateLogger<ClientRepo>();
}
private IDbConnection CreateConnection() => new NpgsqlConnection(_connectionString.ConnectionString);
public void Create(Client client)
{
_logger.LogInformation("Добавление клиента");
_logger.LogDebug("Клиент: {json}", JsonConvert.SerializeObject(client));
try
{
using (var connection = CreateConnection())
{
var sql = "INSERT INTO \"client\" (\"name\", \"phonenumber\", \"clienttype\") " +
"VALUES (@Name, @PhoneNumber, @ClientType)";
connection.Execute(sql, new
{
Name = client.Name,
PhoneNumber = client.PhoneNumber,
ClientType = (int)client.ClientType
});
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении клиента");
throw;
}
}
public void Delete(int id)
{
_logger.LogInformation("Удаление клиента");
_logger.LogDebug("Клиент ID: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "DELETE FROM \"client\" WHERE \"id\" = @Id";
connection.Execute(sql, new { Id = id });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении клиента");
throw;
}
}
public Client Read(int id)
{
_logger.LogInformation("Получение клиента по ID");
_logger.LogDebug("Клиент ID: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "SELECT * FROM \"client\" WHERE \"id\" = @Id";
return connection.QuerySingleOrDefault<Client>(sql, new { Id = id });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении клиента");
throw;
}
}
public IEnumerable<Client> ReadAll()
{
_logger.LogInformation("Получение всех клиентов");
try
{
using (var connection = CreateConnection())
{
var sql = "SELECT * FROM \"client\"";
return connection.Query<Client>(sql);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении списка клиентов");
throw;
}
}
public Client Update(Client client)
{
_logger.LogInformation("Обновление информации о клиенте");
_logger.LogDebug("Клиент: {json}", JsonConvert.SerializeObject(client));
try
{
using (var connection = CreateConnection())
{
var sql = "UPDATE \"client\" SET \"name\" = @Name, \"phonenumber\" = @PhoneNumber, \"clienttype\" = @ClientType " +
"WHERE \"id\" = @Id";
connection.Execute(sql, new
{
Id = client.Id,
Name = client.Name,
PhoneNumber = client.PhoneNumber,
ClientType = (int)client.ClientType
});
return client;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при обновлении информации о клиенте");
throw;
}
}
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectSellPC.Repos;
namespace ProjectSellPC.Repos.Impements
{
public class ConnectionString : IConnectionString
{
string IConnectionString.ConnectionString => "Host=localhost;Username=postgres;Password=78oripop;Database=otp2";
}
}

View File

@@ -0,0 +1,136 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Npgsql;
using ProjectSellPC.Entites;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectSellPC.Repos.Impements
{
public class ProductInChequeRepo : IProductInChequeRepository
{
private readonly IProductRepository _productRepository;
private readonly IConnectionString _connectionString;
private readonly ILogger<ProductInChequeRepo> _logger;
public ProductInChequeRepo(IConnectionString connectionString, ILoggerFactory loggerFactory, IProductRepository productRepository)
{
_connectionString = connectionString;
_logger = loggerFactory.CreateLogger<ProductInChequeRepo>();
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
}
private IDbConnection CreateConnection() => new NpgsqlConnection(_connectionString.ConnectionString);
public void Create(ProductInCheque productInCheque)
{
_logger.LogInformation("Добавление товара в чек");
_logger.LogDebug("Товар в чеке: {json}", Newtonsoft.Json.JsonConvert.SerializeObject(productInCheque));
using (var connection = CreateConnection())
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
try
{
var sql = "INSERT INTO \"productsincheque\" (\"productid\", \"count\") " +
"VALUES (@ProductID, @Count) RETURNING \"ID\"";
productInCheque.ID = connection.ExecuteScalar<int>(sql, new
{
ProductID = productInCheque.ProductID,
Count = productInCheque.Count
}, transaction);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
_logger.LogError(ex, "Ошибка при добавлении товара в чек");
throw;
}
}
}
}
public ProductInCheque Read(int id)
{
_logger.LogInformation("Получение товара в чеке по ID");
_logger.LogDebug("ID товара в чеке: {id}", id);
using (var connection = CreateConnection())
{
try
{
var sql = "SELECT * FROM \"productincheque\" WHERE \"id\" = @ID";
var productInCheque = connection.QuerySingleOrDefault<ProductInCheque>(sql, new { ID = id });
if (productInCheque != null)
{
// Загрузка дополнительной информации о продукте при необходимости
var product = _productRepository.Read(productInCheque.ProductID);
productInCheque.ProductID = product?.ID ?? 0;
}
return productInCheque;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении товара в чеке");
throw;
}
}
}
public IEnumerable<ProductInCheque> ReadAll()
{
_logger.LogInformation("Получение всех товаров в чеках");
using (var connection = CreateConnection())
{
try
{
var sql = "SELECT * FROM \"productincheque\"";
var productsInCheque = connection.Query<ProductInCheque>(sql).ToList();
foreach (var productInCheque in productsInCheque)
{
var product = _productRepository.Read(productInCheque.ProductID);
productInCheque.ProductID = product?.ID ?? 0;
}
return productsInCheque;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении списка товаров в чеках");
throw;
}
}
}
public void Delete(int id)
{
_logger.LogInformation("Удаление товара из чека");
_logger.LogDebug("ID товара в чеке: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "DELETE FROM \"productincheque\" WHERE \"id\" = @ID";
connection.Execute(sql, new { ID = id });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении товара из чека");
throw;
}
}
}
}

View File

@@ -0,0 +1,150 @@
using ProjectSellPC.Entites;
using ProjectSellPC.Entites.Enums;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using System.Data;
using System.Linq.Expressions;
namespace ProjectSellPC.Repos.Impements
{
public class ProductRepo : IProductRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<ProductRepo> _logger;
public ProductRepo(IConnectionString connectionString, ILoggerFactory loggerFactory)
{
_connectionString = connectionString;
//_logger = logger;
_logger = loggerFactory.CreateLogger<ProductRepo>();
}
private IDbConnection CreateConnection() => new NpgsqlConnection(_connectionString.ConnectionString);
public void Create(Product product)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(product));
try
{
using (var connection = CreateConnection())
{
var sql = "INSERT INTO \"product\" (\"name\", \"description\", \"price\", \"producttype\") " +
"VALUES (@Name, @Description, @Price, @ProductType)";
connection.Execute(sql, new
{
Name = product.Name,
Description = product.Description,
Price = product.Price,
ProductType = (int)product.ProductType
});
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void Delete(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "DELETE FROM \"product\" WHERE \"id\" = @Id";
connection.Execute(sql, new { Id = id });
}
}
catch (Exception e)
{
_logger.LogError(e, "Ошибка при удалении объекта");
throw;
}
}
public Product Read(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = $"SELECT * FROM \"product\" WHERE \"id\" = {id}";
return connection.QuerySingleOrDefault<Product>(sql);
}
}
catch (Exception e)
{
_logger.LogError(e, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Product> ReadAll()
{
_logger.LogInformation("Получение всех объектов");
try
{
using (var connection = CreateConnection())
{
var sql = "SELECT * FROM \"product\"";
return connection.Query<Product>(sql).ToList();
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
public Product Update(Product product)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(product));
try
{
using (var connection = CreateConnection())
{
var sql = "UPDATE \"product\" " +
"SET \"name\" = @Name, " +
"\"description\" = @Description, " +
"\"price\" = @Price," +
"\"producttype\" = @ProductType" +
" WHERE \"id\" = @Id";
connection.Execute(sql, new
{
Id = product.ID,
Name = product.Name,
Description = product.Description,
Price = product.Price,
ProductType = (int)product.ProductType
});
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при изменении объекта");
throw;
}
return product;
}
}
}

View File

@@ -0,0 +1,135 @@
using ProjectSellPC.Entites;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace ProjectSellPC.Repos.Impements
{
public class ProductsOnWarehouseRepo : IProductOnWarehouseRepository
{
private readonly IProductRepository _productRepository;
private readonly IWarehouseRepository _warehouseRepository;
private readonly IConnectionString _connectionString;
private readonly ILogger<ProductsOnWarehouseRepo> _logger;
public ProductsOnWarehouseRepo(IConnectionString connectionString, ILoggerFactory loggerFactory,
IProductRepository productRepository,
IWarehouseRepository warehouseRepository)
{
_connectionString = connectionString;
_logger = loggerFactory.CreateLogger<ProductsOnWarehouseRepo>();
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
_warehouseRepository = warehouseRepository ?? throw new ArgumentNullException(nameof(warehouseRepository));
}
private IDbConnection CreateConnection() => new NpgsqlConnection(_connectionString.ConnectionString);
public void Create(ProductsOnWarehouse productsOnWarehouse)
{
_logger.LogInformation("Добавление продукта на склад");
_logger.LogDebug("Продукт на складе: {json}", JsonConvert.SerializeObject(productsOnWarehouse));
using (var connection = CreateConnection())
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
try
{
var sql = "INSERT INTO \"productsonwarehouse\" (\"productid\", \"warehouseid\", \"count\") " +
"VALUES (@ProductId, @WarehouseId, @Count) RETURNING \"id\"";
productsOnWarehouse.Id = connection.ExecuteScalar<int>(sql, new
{
ProductId = productsOnWarehouse.Product.ID,
WarehouseId = productsOnWarehouse.Warehouse.Id,
Count = productsOnWarehouse.Count
}, transaction);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
_logger.LogError(ex, "Ошибка при добавлении продукта на склад");
throw;
}
}
}
}
public ProductsOnWarehouse Read(int id)
{
_logger.LogInformation("Получение продукта на складе по ID");
_logger.LogDebug("ID продукта на складе: {id}", id);
using (var connection = CreateConnection())
{
try
{
var sql = "SELECT * FROM \"productsonwarehouse\" WHERE \"id\" = @Id";
var productOnWarehouse = connection.QuerySingleOrDefault<ProductsOnWarehouse>(sql, new { Id = id });
productOnWarehouse.Warehouse = _warehouseRepository.Read(productOnWarehouse.WarehouseId);
productOnWarehouse.Product = _productRepository.Read(productOnWarehouse.ProductId);
return productOnWarehouse;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении продукта на складе");
throw;
}
}
}
public IEnumerable<ProductsOnWarehouse> ReadAll()
{
_logger.LogInformation("Получение всех продуктов на складе");
using (var connection = CreateConnection())
{
try
{
var sql = "SELECT * FROM \"productsonwarehouse\"";
var answer = connection.Query<ProductsOnWarehouse>(sql).ToList();
foreach (var productOnWarehouse in answer)
{
productOnWarehouse.Product = _productRepository.Read(productOnWarehouse.ProductId);
productOnWarehouse.Warehouse = _warehouseRepository.Read(productOnWarehouse.WarehouseId);
}
return answer;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении списка продуктов на складе");
throw;
}
}
}
public void Delete(int id)
{
_logger.LogInformation("Удаление товара со склада");
_logger.LogDebug("Склад ID: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "DELETE FROM \"productsonwarehouse\" WHERE \"id\" = @Id";
connection.Execute(sql, new { Id = id });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении");
throw;
}
}
}
}

View File

@@ -0,0 +1,140 @@
using ProjectSellPC.Entites;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace ProjectSellPC.Repos.Impements
{
public class WarehouseRepo: IWarehouseRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<WarehouseRepo> _logger;
public WarehouseRepo(IConnectionString connectionString, ILoggerFactory loggerFactory)
{
_connectionString = connectionString;
_logger = loggerFactory.CreateLogger<WarehouseRepo>();
}
private IDbConnection CreateConnection() => new NpgsqlConnection(_connectionString.ConnectionString);
public void Create(Warehouse warehouse)
{
_logger.LogInformation("Добавление склада");
_logger.LogDebug("Склад: {json}", JsonConvert.SerializeObject(warehouse));
try
{
using (var connection = CreateConnection())
{
var sql = "INSERT INTO \"warehouse\" (\"size\", \"adress\") " +
"VALUES (@Size, @Adress)";
connection.Execute(sql, new
{
Size = warehouse.Size,
Adress = warehouse.Adress
});
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении склада");
throw;
}
}
public void Delete(int id)
{
_logger.LogInformation("Удаление склада");
_logger.LogDebug("Склад ID: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "DELETE FROM \"warehouse\" WHERE \"id\" = @Id";
connection.Execute(sql, new { Id = id });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении склада");
throw;
}
}
public Warehouse Read(int id)
{
_logger.LogInformation("Получение склада по ID");
_logger.LogDebug("Склад ID: {id}", id);
try
{
using (var connection = CreateConnection())
{
var sql = "SELECT * FROM \"warehouse\" WHERE \"id\" = @Id";
return connection.QuerySingleOrDefault<Warehouse>(sql, new { Id = id });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении склада");
throw;
}
}
public IEnumerable<Warehouse> ReadAll()
{
_logger.LogInformation("Получение всех складов");
try
{
using (var connection = CreateConnection())
{
var sql = "SELECT * FROM \"warehouse\"";
return connection.Query<Warehouse>(sql).ToList();
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при получении списка складов");
throw;
}
}
public Warehouse Update(Warehouse warehouse)
{
_logger.LogInformation("Обновление информации о складе");
_logger.LogDebug("Склад: {json}", JsonConvert.SerializeObject(warehouse));
try
{
using (var connection = CreateConnection())
{
var sql = "UPDATE \"warehouse\" SET \"size\" = @Size, \"adress\" = @Adress " +
"WHERE \"id\" = @Id";
connection.Execute(sql, new
{
Id = warehouse.Id,
Size = warehouse.Size,
Adress = warehouse.Adress
});
return warehouse;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при обновлении информации о складе");
throw;
}
}
}
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB