From 603bd3918526d6d41cd46586e075b480f9dd9727 Mon Sep 17 00:00:00 2001
From: "evasina2312@gmail.com" <evasina2312@gmail.com>
Date: Wed, 10 May 2023 11:00:22 +0400
Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=206?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ComputersShop/FormImplementer.Designer.cs | 165 ++++++++
 .../ComputersShop/FormImplementer.cs          |  86 ++++
 .../ComputersShop/FormImplementer.resx        |  60 +++
 .../FormImplementers.Designer.cs              | 115 ++++++
 .../ComputersShop/FormImplementers.cs         |  98 +++++
 .../ComputersShop/FormImplementers.resx       |  63 +++
 .../ComputersShop/FormMain.Designer.cs        | 382 +++++++++---------
 ComputersShop/ComputersShop/FormMain.cs       |  26 +-
 ComputersShop/ComputersShop/Program.cs        |  13 +-
 .../ImplementerLogic.cs                       | 115 ++++++
 .../ComputersShopBusinessLogic/OrderLogic.cs  |  18 +-
 .../WorkModeling.cs                           | 147 +++++++
 .../BindingModels/ImplementerBindingModel.cs  |  13 +
 .../BindingModels/OrderBindingModel.cs        |   3 +-
 .../IImplementerLogic.cs                      |  15 +
 .../BusinessLogicsContracts/IOrderLogic.cs    |   3 +-
 .../BusinessLogicsContracts/IWorkProcess.cs   |  10 +
 .../SearchModels/ImplementerSearchModel.cs    |   9 +
 .../SearchModels/OrderSearchModel.cs          |   8 +-
 .../StoragesContracts/IImplementerStorage.cs  |  16 +
 .../ViewModels/ImplementerViewModel.cs        |  17 +
 .../ViewModels/OrderViewModel.cs              |   7 +-
 .../Models/IImplementerModel.cs               |  10 +
 .../ComputersShopDatabase.cs                  |   3 +-
 .../Implements/ImplementerStorage.cs          |  87 ++++
 .../Implements/OrderStorage.cs                |  14 +-
 .../20230510052751_addImplementer.Designer.cs | 212 ++++++++++
 .../20230510052751_addImplementer.cs          |  22 +
 ...20230510055946_add-implementer.Designer.cs | 255 ++++++++++++
 .../20230510055946_add-implementer.cs         |  67 +++
 .../ComputersShopDatabaseModelSnapshot.cs     |  43 ++
 .../Models/Implementer.cs                     |  58 +++
 .../Models/Order.cs                           |  25 +-
 .../DataFileSingleton.cs                      |  12 +-
 .../Implements/ImplementerStorage.cs          |  88 ++++
 .../Models/Implementer.cs                     |  76 ++++
 .../DataListSingleton.cs                      |   6 +-
 .../Implements/ImplementerStorage.cs          | 119 ++++++
 .../Models/Implementer.cs                     |  48 +++
 .../Controllers/ImplementerController.cs      | 103 +++++
 40 files changed, 2426 insertions(+), 211 deletions(-)
 create mode 100644 ComputersShop/ComputersShop/FormImplementer.Designer.cs
 create mode 100644 ComputersShop/ComputersShop/FormImplementer.cs
 create mode 100644 ComputersShop/ComputersShop/FormImplementer.resx
 create mode 100644 ComputersShop/ComputersShop/FormImplementers.Designer.cs
 create mode 100644 ComputersShop/ComputersShop/FormImplementers.cs
 create mode 100644 ComputersShop/ComputersShop/FormImplementers.resx
 create mode 100644 ComputersShop/ComputersShopBusinessLogic/ImplementerLogic.cs
 create mode 100644 ComputersShop/ComputersShopBusinessLogic/WorkModeling.cs
 create mode 100644 ComputersShop/ComputersShopContracts/BindingModels/ImplementerBindingModel.cs
 create mode 100644 ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IImplementerLogic.cs
 create mode 100644 ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IWorkProcess.cs
 create mode 100644 ComputersShop/ComputersShopContracts/SearchModels/ImplementerSearchModel.cs
 create mode 100644 ComputersShop/ComputersShopContracts/StoragesContracts/IImplementerStorage.cs
 create mode 100644 ComputersShop/ComputersShopContracts/ViewModels/ImplementerViewModel.cs
 create mode 100644 ComputersShop/ComputersShopDataModels/Models/IImplementerModel.cs
 create mode 100644 ComputersShop/ComputersShopDatabaseImplement/Implements/ImplementerStorage.cs
 create mode 100644 ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.Designer.cs
 create mode 100644 ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.cs
 create mode 100644 ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.Designer.cs
 create mode 100644 ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.cs
 create mode 100644 ComputersShop/ComputersShopDatabaseImplement/Models/Implementer.cs
 create mode 100644 ComputersShop/ComputersShopFileImplement/Implements/ImplementerStorage.cs
 create mode 100644 ComputersShop/ComputersShopFileImplement/Models/Implementer.cs
 create mode 100644 ComputersShop/ComputersShopImplement/Implements/ImplementerStorage.cs
 create mode 100644 ComputersShop/ComputersShopImplement/Models/Implementer.cs
 create mode 100644 ComputersShop/ComputersShopRestApi/Controllers/ImplementerController.cs

diff --git a/ComputersShop/ComputersShop/FormImplementer.Designer.cs b/ComputersShop/ComputersShop/FormImplementer.Designer.cs
new file mode 100644
index 0000000..208c00b
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormImplementer.Designer.cs
@@ -0,0 +1,165 @@
+namespace ComputersShopView
+{
+	partial class FormImplementer
+	{
+		/// <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.buttonCancel = new System.Windows.Forms.Button();
+			this.buttonSave = new System.Windows.Forms.Button();
+			this.labelQualification = new System.Windows.Forms.Label();
+			this.labelWorkExperience = new System.Windows.Forms.Label();
+			this.labelPassword = new System.Windows.Forms.Label();
+			this.labelName = new System.Windows.Forms.Label();
+			this.textBoxQualification = new System.Windows.Forms.TextBox();
+			this.textBoxWorkExperience = new System.Windows.Forms.TextBox();
+			this.textBoxPassword = new System.Windows.Forms.TextBox();
+			this.textBoxName = new System.Windows.Forms.TextBox();
+			this.SuspendLayout();
+			// 
+			// buttonCancel
+			// 
+			this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.buttonCancel.Location = new System.Drawing.Point(249, 122);
+			this.buttonCancel.Name = "buttonCancel";
+			this.buttonCancel.Size = new System.Drawing.Size(75, 23);
+			this.buttonCancel.TabIndex = 11;
+			this.buttonCancel.Text = "Отмена";
+			this.buttonCancel.UseVisualStyleBackColor = true;
+			this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click);
+			// 
+			// buttonSave
+			// 
+			this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.buttonSave.Location = new System.Drawing.Point(168, 122);
+			this.buttonSave.Name = "buttonSave";
+			this.buttonSave.Size = new System.Drawing.Size(75, 23);
+			this.buttonSave.TabIndex = 12;
+			this.buttonSave.Text = "Сохранить";
+			this.buttonSave.UseVisualStyleBackColor = true;
+			this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
+			// 
+			// labelQualification
+			// 
+			this.labelQualification.AutoSize = true;
+			this.labelQualification.Location = new System.Drawing.Point(12, 96);
+			this.labelQualification.Name = "labelQualification";
+			this.labelQualification.Size = new System.Drawing.Size(88, 15);
+			this.labelQualification.TabIndex = 7;
+			this.labelQualification.Text = "Квалификация";
+			// 
+			// labelWorkExperience
+			// 
+			this.labelWorkExperience.AutoSize = true;
+			this.labelWorkExperience.Location = new System.Drawing.Point(12, 67);
+			this.labelWorkExperience.Name = "labelWorkExperience";
+			this.labelWorkExperience.Size = new System.Drawing.Size(37, 15);
+			this.labelWorkExperience.TabIndex = 8;
+			this.labelWorkExperience.Text = "Опыт";
+			// 
+			// labelPassword
+			// 
+			this.labelPassword.AutoSize = true;
+			this.labelPassword.Location = new System.Drawing.Point(12, 38);
+			this.labelPassword.Name = "labelPassword";
+			this.labelPassword.Size = new System.Drawing.Size(49, 15);
+			this.labelPassword.TabIndex = 9;
+			this.labelPassword.Text = "Пароль";
+			// 
+			// labelName
+			// 
+			this.labelName.AutoSize = true;
+			this.labelName.Location = new System.Drawing.Point(12, 9);
+			this.labelName.Name = "labelName";
+			this.labelName.Size = new System.Drawing.Size(34, 15);
+			this.labelName.TabIndex = 10;
+			this.labelName.Text = "ФИО";
+			// 
+			// textBoxQualification
+			// 
+			this.textBoxQualification.Location = new System.Drawing.Point(106, 93);
+			this.textBoxQualification.Name = "textBoxQualification";
+			this.textBoxQualification.Size = new System.Drawing.Size(218, 23);
+			this.textBoxQualification.TabIndex = 3;
+			// 
+			// textBoxWorkExperience
+			// 
+			this.textBoxWorkExperience.Location = new System.Drawing.Point(106, 64);
+			this.textBoxWorkExperience.Name = "textBoxWorkExperience";
+			this.textBoxWorkExperience.Size = new System.Drawing.Size(218, 23);
+			this.textBoxWorkExperience.TabIndex = 4;
+			// 
+			// textBoxPassword
+			// 
+			this.textBoxPassword.Location = new System.Drawing.Point(106, 35);
+			this.textBoxPassword.Name = "textBoxPassword";
+			this.textBoxPassword.Size = new System.Drawing.Size(218, 23);
+			this.textBoxPassword.TabIndex = 5;
+			// 
+			// textBoxName
+			// 
+			this.textBoxName.Location = new System.Drawing.Point(106, 6);
+			this.textBoxName.Name = "textBoxName";
+			this.textBoxName.Size = new System.Drawing.Size(218, 23);
+			this.textBoxName.TabIndex = 6;
+			// 
+			// FormImplementer
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(337, 167);
+			this.Controls.Add(this.buttonCancel);
+			this.Controls.Add(this.buttonSave);
+			this.Controls.Add(this.labelQualification);
+			this.Controls.Add(this.labelWorkExperience);
+			this.Controls.Add(this.labelPassword);
+			this.Controls.Add(this.labelName);
+			this.Controls.Add(this.textBoxQualification);
+			this.Controls.Add(this.textBoxWorkExperience);
+			this.Controls.Add(this.textBoxPassword);
+			this.Controls.Add(this.textBoxName);
+			this.Name = "FormImplementer";
+			this.Text = "Исполнитель";
+			this.Load += new System.EventHandler(this.FormImplementer_Load);
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private Button buttonCancel;
+		private Button buttonSave;
+		private Label labelQualification;
+		private Label labelWorkExperience;
+		private Label labelPassword;
+		private Label labelName;
+		private TextBox textBoxQualification;
+		private TextBox textBoxWorkExperience;
+		private TextBox textBoxPassword;
+		private TextBox textBoxName;
+	}
+}
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/FormImplementer.cs b/ComputersShop/ComputersShop/FormImplementer.cs
new file mode 100644
index 0000000..5c3c1b0
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormImplementer.cs
@@ -0,0 +1,86 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.BusinessLogicsContracts;
+using ComputersShopContracts.SearchModels;
+using Microsoft.Extensions.Logging;
+
+namespace ComputersShopView
+{
+	public partial class FormImplementer : Form
+	{
+		private readonly ILogger _logger;
+		private readonly IImplementerLogic _implementerLogic;
+		private int? _id;
+		public int Id { set { _id = value; } }
+		public FormImplementer(ILogger<FormImplementer> logger, IImplementerLogic implementerLogic)
+		{
+			InitializeComponent();
+			_logger = logger;
+			_implementerLogic = implementerLogic;
+		}
+		private void FormImplementer_Load(object sender, EventArgs e)
+		{
+			if (_id.HasValue)
+			{
+				try
+				{
+					_logger.LogInformation("Получение сотрудника");
+					var view = _implementerLogic.ReadElement(new ImplementerSearchModel
+					{
+						Id = _id.Value
+					});
+					if (view != null)
+					{
+						textBoxName.Text = view.ImplementerFIO;
+						textBoxPassword.Text = view.Password;
+						textBoxQualification.Text = view.Qualification.ToString();
+						textBoxWorkExperience.Text = view.WorkExperience.ToString();
+					}
+				}
+				catch (Exception ex)
+				{
+					_logger.LogError(ex, "Ошибка получения сотрудника");
+					MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+					MessageBoxIcon.Error);
+				}
+			}
+		}
+		private void ButtonSave_Click(object sender, EventArgs e)
+		{
+			if (string.IsNullOrEmpty(textBoxName.Text))
+			{
+				MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+				return;
+			}
+			_logger.LogInformation("Сохранение сотрудника");
+			try
+			{
+				var model = new ImplementerBindingModel()
+				{
+					Id = _id ?? 0,
+					ImplementerFIO = textBoxName.Text,
+					Password = textBoxPassword.Text,
+					Qualification = Convert.ToInt32(textBoxQualification.Text),
+					WorkExperience = Convert.ToInt32(textBoxWorkExperience.Text)
+				};
+				var operationResult = _id.HasValue ? _implementerLogic.Update(model) : _implementerLogic.Create(model);
+				if (!operationResult)
+				{
+					throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
+				}
+				MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
+				DialogResult = DialogResult.OK;
+				Close();
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка сохранения сотрудника");
+				MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+			}
+		}
+		private void ButtonCancel_Click(object sender, EventArgs e)
+		{
+			DialogResult = DialogResult.Cancel;
+			Close();
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShop/FormImplementer.resx b/ComputersShop/ComputersShop/FormImplementer.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormImplementer.resx
@@ -0,0 +1,60 @@
+<root>
+  <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>
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/FormImplementers.Designer.cs b/ComputersShop/ComputersShop/FormImplementers.Designer.cs
new file mode 100644
index 0000000..ed2be9b
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormImplementers.Designer.cs
@@ -0,0 +1,115 @@
+namespace ComputersShopView
+{
+	partial class FormImplementers
+	{
+		/// <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.Windows.Forms.Button buttonRef;
+			this.buttonDel = new System.Windows.Forms.Button();
+			this.buttonUpd = new System.Windows.Forms.Button();
+			this.buttonAdd = new System.Windows.Forms.Button();
+			this.dataGridView = new System.Windows.Forms.DataGridView();
+			buttonRef = new System.Windows.Forms.Button();
+			((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// buttonRef
+			// 
+			buttonRef.Location = new System.Drawing.Point(620, 99);
+			buttonRef.Name = "buttonRef";
+			buttonRef.Size = new System.Drawing.Size(174, 23);
+			buttonRef.TabIndex = 3;
+			buttonRef.Text = "Обновить";
+			buttonRef.UseVisualStyleBackColor = true;
+			buttonRef.Click += new System.EventHandler(this.ButtonRef_Click);
+			// 
+			// buttonDel
+			// 
+			this.buttonDel.Location = new System.Drawing.Point(620, 70);
+			this.buttonDel.Name = "buttonDel";
+			this.buttonDel.Size = new System.Drawing.Size(174, 23);
+			this.buttonDel.TabIndex = 4;
+			this.buttonDel.Text = "Удалить";
+			this.buttonDel.UseVisualStyleBackColor = true;
+			this.buttonDel.Click += new System.EventHandler(this.ButtonDel_Click);
+			// 
+			// buttonUpd
+			// 
+			this.buttonUpd.Location = new System.Drawing.Point(620, 41);
+			this.buttonUpd.Name = "buttonUpd";
+			this.buttonUpd.Size = new System.Drawing.Size(174, 23);
+			this.buttonUpd.TabIndex = 5;
+			this.buttonUpd.Text = "Изменить";
+			this.buttonUpd.UseVisualStyleBackColor = true;
+			this.buttonUpd.Click += new System.EventHandler(this.ButtonUpd_Click);
+			// 
+			// buttonAdd
+			// 
+			this.buttonAdd.Location = new System.Drawing.Point(620, 12);
+			this.buttonAdd.Name = "buttonAdd";
+			this.buttonAdd.Size = new System.Drawing.Size(174, 23);
+			this.buttonAdd.TabIndex = 6;
+			this.buttonAdd.Text = "Добавить";
+			this.buttonAdd.UseVisualStyleBackColor = true;
+			this.buttonAdd.Click += new System.EventHandler(this.ButtonAdd_Click);
+			// 
+			// dataGridView
+			// 
+			this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
+			this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+			this.dataGridView.Location = new System.Drawing.Point(6, 0);
+			this.dataGridView.Name = "dataGridView";
+			this.dataGridView.RowTemplate.Height = 25;
+			this.dataGridView.Size = new System.Drawing.Size(608, 450);
+			this.dataGridView.TabIndex = 2;
+			// 
+			// FormImplementers
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(800, 450);
+			this.Controls.Add(buttonRef);
+			this.Controls.Add(this.buttonDel);
+			this.Controls.Add(this.buttonUpd);
+			this.Controls.Add(this.buttonAdd);
+			this.Controls.Add(this.dataGridView);
+			this.Name = "FormImplementers";
+			this.Text = "Сотрудники";
+			this.Load += new System.EventHandler(this.FormImplementers_Load);
+			((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private Button buttonDel;
+		private Button buttonUpd;
+		private Button buttonAdd;
+		private DataGridView dataGridView;
+	}
+}
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/FormImplementers.cs b/ComputersShop/ComputersShop/FormImplementers.cs
new file mode 100644
index 0000000..9198870
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormImplementers.cs
@@ -0,0 +1,98 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+
+namespace ComputersShopView
+{
+	public partial class FormImplementers : Form
+	{
+		IImplementerLogic _implementerLogic;
+		ILogger _logger;
+		public FormImplementers(IImplementerLogic implementerLogic, ILogger<FormImplementers> logger)
+		{
+			_implementerLogic= implementerLogic;
+			_logger = logger;
+			InitializeComponent();
+		}
+		private void FormImplementers_Load(object sender, EventArgs e)
+		{
+			LoadData();
+		}
+		private void LoadData()
+		{
+			try
+			{
+				var list = _implementerLogic.ReadList(null);
+				if (list != null)
+				{
+					dataGridView.DataSource = list;
+					//dataGridView.Columns["Id"].Visible = false;
+					//dataGridView.Columns["ComponentName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+				}
+				_logger.LogInformation("Загрузка сотрудников");
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка загрузки сотрудников");
+				MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+			}
+		}
+		private void ButtonAdd_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormImplementer));
+			if (service is FormImplementer form)
+			{
+				if (form.ShowDialog() == DialogResult.OK)
+				{
+					LoadData();
+				}
+			}
+		}
+		private void ButtonUpd_Click(object sender, EventArgs e)
+		{
+			if (dataGridView.SelectedRows.Count == 1)
+			{
+				var service = Program.ServiceProvider?.GetService(typeof(FormImplementer));
+				if (service is FormImplementer form)
+				{
+					form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
+					if (form.ShowDialog() == DialogResult.OK)
+					{
+						LoadData();
+					}
+				}
+			}
+		}
+		private void ButtonDel_Click(object sender, EventArgs e)
+		{
+			if (dataGridView.SelectedRows.Count == 1)
+			{
+				if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+				{
+					int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
+					_logger.LogInformation("Удаление сотрудника");
+					try
+					{
+						if (!_implementerLogic.Delete(new ImplementerBindingModel
+						{
+							Id = id
+						}))
+						{
+							throw new Exception("Ошибка при удалении. Дополнительная информация в логах.");
+						}
+						LoadData();
+					}
+					catch (Exception ex)
+					{
+						_logger.LogError(ex, "Ошибка удаления сотрудника");
+						MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+					}
+				}
+			}
+		}
+		private void ButtonRef_Click(object sender, EventArgs e)
+		{
+			LoadData();
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShop/FormImplementers.resx b/ComputersShop/ComputersShop/FormImplementers.resx
new file mode 100644
index 0000000..fa1d9b6
--- /dev/null
+++ b/ComputersShop/ComputersShop/FormImplementers.resx
@@ -0,0 +1,63 @@
+<root>
+  <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="buttonRef.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/FormMain.Designer.cs b/ComputersShop/ComputersShop/FormMain.Designer.cs
index d4113d2..5392132 100644
--- a/ComputersShop/ComputersShop/FormMain.Designer.cs
+++ b/ComputersShop/ComputersShop/FormMain.Designer.cs
@@ -28,192 +28,210 @@
         /// </summary>
         private void InitializeComponent()
         {
-            this.buttonRef = new System.Windows.Forms.Button();
-            this.buttonIssuedOrder = new System.Windows.Forms.Button();
-            this.buttonOrderReady = new System.Windows.Forms.Button();
-            this.buttonTakeOrderInWork = new System.Windows.Forms.Button();
-            this.buttonCreateOrder = new System.Windows.Forms.Button();
-            this.menuStrip = new System.Windows.Forms.MenuStrip();
-            this.refbooksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.componentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.computersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.clientsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.reportsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.reportComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.reportComputerComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.reportOrdersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.dataGridView = new System.Windows.Forms.DataGridView();
-            this.menuStrip.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
-            this.SuspendLayout();
-            // 
-            // buttonRef
-            // 
-            this.buttonRef.Location = new System.Drawing.Point(1083, 195);
-            this.buttonRef.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.buttonRef.Name = "buttonRef";
-            this.buttonRef.RightToLeft = System.Windows.Forms.RightToLeft.No;
-            this.buttonRef.Size = new System.Drawing.Size(323, 31);
-            this.buttonRef.TabIndex = 4;
-            this.buttonRef.Text = "Обновить список";
-            this.buttonRef.UseVisualStyleBackColor = true;
-            this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click);
-            // 
-            // buttonIssuedOrder
-            // 
-            this.buttonIssuedOrder.Location = new System.Drawing.Point(1084, 156);
-            this.buttonIssuedOrder.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.buttonIssuedOrder.Name = "buttonIssuedOrder";
-            this.buttonIssuedOrder.RightToLeft = System.Windows.Forms.RightToLeft.No;
-            this.buttonIssuedOrder.Size = new System.Drawing.Size(323, 31);
-            this.buttonIssuedOrder.TabIndex = 5;
-            this.buttonIssuedOrder.Text = "Заказ выдан";
-            this.buttonIssuedOrder.UseVisualStyleBackColor = true;
-            this.buttonIssuedOrder.Click += new System.EventHandler(this.ButtonIssuedOrder_Click);
-            // 
-            // buttonOrderReady
-            // 
-            this.buttonOrderReady.Location = new System.Drawing.Point(1083, 117);
-            this.buttonOrderReady.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.buttonOrderReady.Name = "buttonOrderReady";
-            this.buttonOrderReady.RightToLeft = System.Windows.Forms.RightToLeft.No;
-            this.buttonOrderReady.Size = new System.Drawing.Size(323, 31);
-            this.buttonOrderReady.TabIndex = 6;
-            this.buttonOrderReady.Text = "Заказ готов";
-            this.buttonOrderReady.UseVisualStyleBackColor = true;
-            this.buttonOrderReady.Click += new System.EventHandler(this.ButtonOrderReady_Click);
-            // 
-            // buttonTakeOrderInWork
-            // 
-            this.buttonTakeOrderInWork.Location = new System.Drawing.Point(1083, 79);
-            this.buttonTakeOrderInWork.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.buttonTakeOrderInWork.Name = "buttonTakeOrderInWork";
-            this.buttonTakeOrderInWork.RightToLeft = System.Windows.Forms.RightToLeft.No;
-            this.buttonTakeOrderInWork.Size = new System.Drawing.Size(323, 31);
-            this.buttonTakeOrderInWork.TabIndex = 7;
-            this.buttonTakeOrderInWork.Text = "Отдать на выполнение";
-            this.buttonTakeOrderInWork.UseVisualStyleBackColor = true;
-            this.buttonTakeOrderInWork.Click += new System.EventHandler(this.ButtonTakeOrderInWork_Click);
-            // 
-            // buttonCreateOrder
-            // 
-            this.buttonCreateOrder.Location = new System.Drawing.Point(1083, 40);
-            this.buttonCreateOrder.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.buttonCreateOrder.Name = "buttonCreateOrder";
-            this.buttonCreateOrder.RightToLeft = System.Windows.Forms.RightToLeft.No;
-            this.buttonCreateOrder.Size = new System.Drawing.Size(323, 31);
-            this.buttonCreateOrder.TabIndex = 8;
-            this.buttonCreateOrder.Text = "Создать заказ";
-            this.buttonCreateOrder.UseVisualStyleBackColor = true;
-            this.buttonCreateOrder.Click += new System.EventHandler(this.ButtonCreateOrder_Click);
-            // 
-            // menuStrip
-            // 
-            this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
-            this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+			this.buttonRef = new System.Windows.Forms.Button();
+			this.buttonIssuedOrder = new System.Windows.Forms.Button();
+			this.buttonOrderReady = new System.Windows.Forms.Button();
+			this.buttonTakeOrderInWork = new System.Windows.Forms.Button();
+			this.buttonCreateOrder = new System.Windows.Forms.Button();
+			this.menuStrip = new System.Windows.Forms.MenuStrip();
+			this.refbooksToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.componentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.computersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.clientsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.reportsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.reportComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.reportComputerComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.reportOrdersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.startWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.dataGridView = new System.Windows.Forms.DataGridView();
+			this.implementersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.menuStrip.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// buttonRef
+			// 
+			this.buttonRef.Location = new System.Drawing.Point(1083, 195);
+			this.buttonRef.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.buttonRef.Name = "buttonRef";
+			this.buttonRef.RightToLeft = System.Windows.Forms.RightToLeft.No;
+			this.buttonRef.Size = new System.Drawing.Size(323, 31);
+			this.buttonRef.TabIndex = 4;
+			this.buttonRef.Text = "Обновить список";
+			this.buttonRef.UseVisualStyleBackColor = true;
+			this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click);
+			// 
+			// buttonIssuedOrder
+			// 
+			this.buttonIssuedOrder.Location = new System.Drawing.Point(1084, 156);
+			this.buttonIssuedOrder.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.buttonIssuedOrder.Name = "buttonIssuedOrder";
+			this.buttonIssuedOrder.RightToLeft = System.Windows.Forms.RightToLeft.No;
+			this.buttonIssuedOrder.Size = new System.Drawing.Size(323, 31);
+			this.buttonIssuedOrder.TabIndex = 5;
+			this.buttonIssuedOrder.Text = "Заказ выдан";
+			this.buttonIssuedOrder.UseVisualStyleBackColor = true;
+			this.buttonIssuedOrder.Click += new System.EventHandler(this.ButtonIssuedOrder_Click);
+			// 
+			// buttonOrderReady
+			// 
+			this.buttonOrderReady.Location = new System.Drawing.Point(1083, 117);
+			this.buttonOrderReady.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.buttonOrderReady.Name = "buttonOrderReady";
+			this.buttonOrderReady.RightToLeft = System.Windows.Forms.RightToLeft.No;
+			this.buttonOrderReady.Size = new System.Drawing.Size(323, 31);
+			this.buttonOrderReady.TabIndex = 6;
+			this.buttonOrderReady.Text = "Заказ готов";
+			this.buttonOrderReady.UseVisualStyleBackColor = true;
+			this.buttonOrderReady.Click += new System.EventHandler(this.ButtonOrderReady_Click);
+			// 
+			// buttonTakeOrderInWork
+			// 
+			this.buttonTakeOrderInWork.Location = new System.Drawing.Point(1083, 79);
+			this.buttonTakeOrderInWork.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.buttonTakeOrderInWork.Name = "buttonTakeOrderInWork";
+			this.buttonTakeOrderInWork.RightToLeft = System.Windows.Forms.RightToLeft.No;
+			this.buttonTakeOrderInWork.Size = new System.Drawing.Size(323, 31);
+			this.buttonTakeOrderInWork.TabIndex = 7;
+			this.buttonTakeOrderInWork.Text = "Отдать на выполнение";
+			this.buttonTakeOrderInWork.UseVisualStyleBackColor = true;
+			this.buttonTakeOrderInWork.Click += new System.EventHandler(this.ButtonTakeOrderInWork_Click);
+			// 
+			// buttonCreateOrder
+			// 
+			this.buttonCreateOrder.Location = new System.Drawing.Point(1083, 40);
+			this.buttonCreateOrder.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.buttonCreateOrder.Name = "buttonCreateOrder";
+			this.buttonCreateOrder.RightToLeft = System.Windows.Forms.RightToLeft.No;
+			this.buttonCreateOrder.Size = new System.Drawing.Size(323, 31);
+			this.buttonCreateOrder.TabIndex = 8;
+			this.buttonCreateOrder.Text = "Создать заказ";
+			this.buttonCreateOrder.UseVisualStyleBackColor = true;
+			this.buttonCreateOrder.Click += new System.EventHandler(this.ButtonCreateOrder_Click);
+			// 
+			// menuStrip
+			// 
+			this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
+			this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.refbooksToolStripMenuItem,
-            this.reportsToolStripMenuItem});
-            this.menuStrip.Location = new System.Drawing.Point(0, 0);
-            this.menuStrip.Name = "menuStrip";
-            this.menuStrip.Size = new System.Drawing.Size(1418, 28);
-            this.menuStrip.TabIndex = 9;
-            this.menuStrip.Text = "menuStrip1";
-            // 
-            // refbooksToolStripMenuItem
-            // 
-            this.refbooksToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.reportsToolStripMenuItem,
+            this.startWorkToolStripMenuItem});
+			this.menuStrip.Location = new System.Drawing.Point(0, 0);
+			this.menuStrip.Name = "menuStrip";
+			this.menuStrip.Size = new System.Drawing.Size(1418, 28);
+			this.menuStrip.TabIndex = 9;
+			this.menuStrip.Text = "menuStrip1";
+			// 
+			// refbooksToolStripMenuItem
+			// 
+			this.refbooksToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.componentsToolStripMenuItem,
             this.computersToolStripMenuItem,
-            this.clientsToolStripMenuItem});
-            this.refbooksToolStripMenuItem.Name = "refbooksToolStripMenuItem";
-            this.refbooksToolStripMenuItem.Size = new System.Drawing.Size(117, 24);
-            this.refbooksToolStripMenuItem.Text = "Справочники";
-            // 
-            // componentsToolStripMenuItem
-            // 
-            this.componentsToolStripMenuItem.Name = "componentsToolStripMenuItem";
-            this.componentsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
-            this.componentsToolStripMenuItem.Text = "Компоненты";
-            this.componentsToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click);
-            // 
-            // computersToolStripMenuItem
-            // 
-            this.computersToolStripMenuItem.Name = "computersToolStripMenuItem";
-            this.computersToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
-            this.computersToolStripMenuItem.Text = "Изделия";
-            this.computersToolStripMenuItem.Click += new System.EventHandler(this.ComputersToolStripMenuItem_Click);
-            // 
-            // clientsToolStripMenuItem
-            // 
-            this.clientsToolStripMenuItem.Name = "clientsToolStripMenuItem";
-            this.clientsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
-            this.clientsToolStripMenuItem.Text = "Клиенты";
-            this.clientsToolStripMenuItem.Click += new System.EventHandler(this.ClientsToolStripMenuItem_Click);
-            // 
-            // reportsToolStripMenuItem
-            // 
-            this.reportsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.clientsToolStripMenuItem,
+            this.implementersToolStripMenuItem});
+			this.refbooksToolStripMenuItem.Name = "refbooksToolStripMenuItem";
+			this.refbooksToolStripMenuItem.Size = new System.Drawing.Size(117, 24);
+			this.refbooksToolStripMenuItem.Text = "Справочники";
+			// 
+			// componentsToolStripMenuItem
+			// 
+			this.componentsToolStripMenuItem.Name = "componentsToolStripMenuItem";
+			this.componentsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
+			this.componentsToolStripMenuItem.Text = "Компоненты";
+			this.componentsToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click);
+			// 
+			// computersToolStripMenuItem
+			// 
+			this.computersToolStripMenuItem.Name = "computersToolStripMenuItem";
+			this.computersToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
+			this.computersToolStripMenuItem.Text = "Изделия";
+			this.computersToolStripMenuItem.Click += new System.EventHandler(this.ComputersToolStripMenuItem_Click);
+			// 
+			// clientsToolStripMenuItem
+			// 
+			this.clientsToolStripMenuItem.Name = "clientsToolStripMenuItem";
+			this.clientsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
+			this.clientsToolStripMenuItem.Text = "Клиенты";
+			this.clientsToolStripMenuItem.Click += new System.EventHandler(this.ClientsToolStripMenuItem_Click);
+			// 
+			// reportsToolStripMenuItem
+			// 
+			this.reportsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.reportComponentsToolStripMenuItem,
             this.reportComputerComponentsToolStripMenuItem,
             this.reportOrdersToolStripMenuItem});
-            this.reportsToolStripMenuItem.Name = "reportsToolStripMenuItem";
-            this.reportsToolStripMenuItem.Size = new System.Drawing.Size(62, 24);
-            this.reportsToolStripMenuItem.Text = "Отчет";
-            // 
-            // reportComponentsToolStripMenuItem
-            // 
-            this.reportComponentsToolStripMenuItem.Name = "reportComponentsToolStripMenuItem";
-            this.reportComponentsToolStripMenuItem.Size = new System.Drawing.Size(276, 26);
-            this.reportComponentsToolStripMenuItem.Text = "Список компонентов";
-            this.reportComponentsToolStripMenuItem.Click += new System.EventHandler(this.ReportComponentsToolStripMenuItem_Click);
-            // 
-            // reportComputerComponentsToolStripMenuItem
-            // 
-            this.reportComputerComponentsToolStripMenuItem.Name = "reportComputerComponentsToolStripMenuItem";
-            this.reportComputerComponentsToolStripMenuItem.Size = new System.Drawing.Size(276, 26);
-            this.reportComputerComponentsToolStripMenuItem.Text = "Компоненты по изделиям";
-            this.reportComputerComponentsToolStripMenuItem.Click += new System.EventHandler(this.ReportComputerComponentsToolStripMenuItem_Click);
-            // 
-            // reportOrdersToolStripMenuItem
-            // 
-            this.reportOrdersToolStripMenuItem.Name = "reportOrdersToolStripMenuItem";
-            this.reportOrdersToolStripMenuItem.Size = new System.Drawing.Size(276, 26);
-            this.reportOrdersToolStripMenuItem.Text = "Список заказов";
-            this.reportOrdersToolStripMenuItem.Click += new System.EventHandler(this.ReportOrdersToolStripMenuItem_Click);
-            // 
-            // dataGridView
-            // 
-            this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
-            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-            this.dataGridView.Location = new System.Drawing.Point(12, 40);
-            this.dataGridView.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
-            this.dataGridView.Name = "dataGridView";
-            this.dataGridView.RowHeadersWidth = 51;
-            this.dataGridView.RowTemplate.Height = 25;
-            this.dataGridView.Size = new System.Drawing.Size(1050, 608);
-            this.dataGridView.TabIndex = 3;
-            // 
-            // FormMain
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(1418, 677);
-            this.Controls.Add(this.buttonRef);
-            this.Controls.Add(this.buttonIssuedOrder);
-            this.Controls.Add(this.buttonOrderReady);
-            this.Controls.Add(this.buttonTakeOrderInWork);
-            this.Controls.Add(this.buttonCreateOrder);
-            this.Controls.Add(this.dataGridView);
-            this.Controls.Add(this.menuStrip);
-            this.MainMenuStrip = this.menuStrip;
-            this.Name = "FormMain";
-            this.Text = "Продажа компьютеров";
-            this.Load += new System.EventHandler(this.FormMain_Load);
-            this.menuStrip.ResumeLayout(false);
-            this.menuStrip.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
-            this.ResumeLayout(false);
-            this.PerformLayout();
+			this.reportsToolStripMenuItem.Name = "reportsToolStripMenuItem";
+			this.reportsToolStripMenuItem.Size = new System.Drawing.Size(62, 24);
+			this.reportsToolStripMenuItem.Text = "Отчет";
+			// 
+			// reportComponentsToolStripMenuItem
+			// 
+			this.reportComponentsToolStripMenuItem.Name = "reportComponentsToolStripMenuItem";
+			this.reportComponentsToolStripMenuItem.Size = new System.Drawing.Size(276, 26);
+			this.reportComponentsToolStripMenuItem.Text = "Список компонентов";
+			this.reportComponentsToolStripMenuItem.Click += new System.EventHandler(this.ReportComponentsToolStripMenuItem_Click);
+			// 
+			// reportComputerComponentsToolStripMenuItem
+			// 
+			this.reportComputerComponentsToolStripMenuItem.Name = "reportComputerComponentsToolStripMenuItem";
+			this.reportComputerComponentsToolStripMenuItem.Size = new System.Drawing.Size(276, 26);
+			this.reportComputerComponentsToolStripMenuItem.Text = "Компоненты по изделиям";
+			this.reportComputerComponentsToolStripMenuItem.Click += new System.EventHandler(this.ReportComputerComponentsToolStripMenuItem_Click);
+			// 
+			// reportOrdersToolStripMenuItem
+			// 
+			this.reportOrdersToolStripMenuItem.Name = "reportOrdersToolStripMenuItem";
+			this.reportOrdersToolStripMenuItem.Size = new System.Drawing.Size(276, 26);
+			this.reportOrdersToolStripMenuItem.Text = "Список заказов";
+			this.reportOrdersToolStripMenuItem.Click += new System.EventHandler(this.ReportOrdersToolStripMenuItem_Click);
+			// 
+			// startWorkToolStripMenuItem
+			// 
+			this.startWorkToolStripMenuItem.Name = "startWorkToolStripMenuItem";
+			this.startWorkToolStripMenuItem.Size = new System.Drawing.Size(114, 24);
+			this.startWorkToolStripMenuItem.Text = "Запуск работ";
+			this.startWorkToolStripMenuItem.Click += new System.EventHandler(this.startWorkToolStripMenuItem_Click);
+			// 
+			// dataGridView
+			// 
+			this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
+			this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+			this.dataGridView.Location = new System.Drawing.Point(12, 40);
+			this.dataGridView.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.dataGridView.Name = "dataGridView";
+			this.dataGridView.RowHeadersWidth = 51;
+			this.dataGridView.RowTemplate.Height = 25;
+			this.dataGridView.Size = new System.Drawing.Size(1050, 608);
+			this.dataGridView.TabIndex = 3;
+			// 
+			// implementersToolStripMenuItem
+			// 
+			this.implementersToolStripMenuItem.Name = "implementersToolStripMenuItem";
+			this.implementersToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
+			this.implementersToolStripMenuItem.Text = "Исполнители";
+			this.implementersToolStripMenuItem.Click += new System.EventHandler(this.implementersToolStripMenuItem_Click);
+			// 
+			// FormMain
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(1418, 677);
+			this.Controls.Add(this.buttonRef);
+			this.Controls.Add(this.buttonIssuedOrder);
+			this.Controls.Add(this.buttonOrderReady);
+			this.Controls.Add(this.buttonTakeOrderInWork);
+			this.Controls.Add(this.buttonCreateOrder);
+			this.Controls.Add(this.dataGridView);
+			this.Controls.Add(this.menuStrip);
+			this.MainMenuStrip = this.menuStrip;
+			this.Name = "FormMain";
+			this.Text = "Продажа компьютеров";
+			this.Load += new System.EventHandler(this.FormMain_Load);
+			this.menuStrip.ResumeLayout(false);
+			this.menuStrip.PerformLayout();
+			((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+			this.ResumeLayout(false);
+			this.PerformLayout();
 
         }
 
@@ -234,5 +252,7 @@
         private ToolStripMenuItem reportOrdersToolStripMenuItem;
         private ToolStripMenuItem clientsToolStripMenuItem;
         private DataGridView dataGridView;
-    }
+		private ToolStripMenuItem startWorkToolStripMenuItem;
+		private ToolStripMenuItem implementersToolStripMenuItem;
+	}
 }
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/FormMain.cs b/ComputersShop/ComputersShop/FormMain.cs
index 4d8d036..951f1f6 100644
--- a/ComputersShop/ComputersShop/FormMain.cs
+++ b/ComputersShop/ComputersShop/FormMain.cs
@@ -10,13 +10,16 @@ namespace ComputersShopView
         private readonly ILogger _logger;
         private readonly IOrderLogic _orderLogic;
         private readonly IReportLogic _reportLogic;
-        public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic, IReportLogic reportLogic)
+		private readonly IWorkProcess _workProcess;
+		public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess)
         {
             InitializeComponent();
             _logger = logger;
             _orderLogic = orderLogic;
             _reportLogic = reportLogic;
-        }
+            _workProcess = workProcess;
+
+		}
         private void FormMain_Load(object sender, EventArgs e)
         {
             LoadData();
@@ -32,7 +35,8 @@ namespace ComputersShopView
                     dataGridView.DataSource = list;
                     dataGridView.Columns["ComputerId"].Visible = false;
                     dataGridView.Columns["ClientId"].Visible = false;
-                    dataGridView.Columns["ComputerName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+					dataGridView.Columns["ImplementerId"].Visible = false;
+					dataGridView.Columns["ComputerName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                 }
             }
             catch (Exception ex)
@@ -180,5 +184,19 @@ namespace ComputersShopView
                 LoadData();
             }
         }
-    }
+
+		private void startWorkToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			_workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic);
+		}
+
+		private void implementersToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			var service = Program.ServiceProvider?.GetService(typeof(FormImplementers));
+			if (service is FormImplementers form)
+			{
+				form.ShowDialog();
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/ComputersShop/ComputersShop/Program.cs b/ComputersShop/ComputersShop/Program.cs
index b82d2ab..c9645d2 100644
--- a/ComputersShop/ComputersShop/Program.cs
+++ b/ComputersShop/ComputersShop/Program.cs
@@ -36,12 +36,15 @@ namespace ComputersShopView
             services.AddTransient<IOrderStorage, OrderStorage>();
             services.AddTransient<IComputerStorage, ComputerStorage>();
             services.AddTransient<IClientStorage, ClientStorage>();
-            services.AddTransient<IComponentLogic, ComponentLogic>();
+			services.AddTransient<IImplementerStorage, ImplementerStorage>();
+			services.AddTransient<IComponentLogic, ComponentLogic>();
             services.AddTransient<IOrderLogic, OrderLogic>();
             services.AddTransient<IComputerLogic, ComputerLogic>();
             services.AddTransient<IClientLogic, ClientLogic>();
-            services.AddTransient<IReportLogic, ReportLogic>();
-            services.AddTransient<AbstractSaveToWord, SaveToWord>();
+			services.AddTransient<IImplementerLogic, ImplementerLogic>();
+			services.AddTransient<IReportLogic, ReportLogic>();
+			services.AddTransient<IWorkProcess, WorkModeling>();
+			services.AddTransient<AbstractSaveToWord, SaveToWord>();
             services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
             services.AddTransient<AbstractSaveToPdf, SaveToPdf>();
             services.AddTransient<FormMain>();
@@ -54,6 +57,8 @@ namespace ComputersShopView
             services.AddTransient<FormReportComputerComponents>();
             services.AddTransient<FormReportOrders>();
             services.AddTransient<FormClient>();
-        }
+			services.AddTransient<FormImplementer>();
+			services.AddTransient<FormImplementers>();
+		}
     }
 }
\ No newline at end of file
diff --git a/ComputersShop/ComputersShopBusinessLogic/ImplementerLogic.cs b/ComputersShop/ComputersShopBusinessLogic/ImplementerLogic.cs
new file mode 100644
index 0000000..8ff6bfc
--- /dev/null
+++ b/ComputersShop/ComputersShopBusinessLogic/ImplementerLogic.cs
@@ -0,0 +1,115 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.BusinessLogicsContracts;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.StoragesContracts;
+using ComputersShopContracts.ViewModels;
+using Microsoft.Extensions.Logging;
+
+namespace ComputersShopBusinessLogic
+{
+	public class ImplementerLogic : IImplementerLogic
+	{
+		private readonly ILogger _logger;
+		private readonly IImplementerStorage _implementerStorage;
+		public ImplementerLogic(ILogger<ImplementerLogic> logger, IImplementerStorage implementerStorage)
+		{
+			_logger = logger;
+			_implementerStorage = implementerStorage;
+		}
+		public List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model)
+		{
+			_logger.LogInformation("Readlist. Id: {Id}", model?.Id);
+			var list = model == null ? _implementerStorage.GetFullList() : _implementerStorage.GetFilteredList(model);
+			if (list == null)
+			{
+				_logger.LogWarning("ReadList return null list");
+				return null;
+			}
+			_logger.LogInformation("Readlist. Count: {Count}", list.Count);
+			return list;
+		}
+		public ImplementerViewModel? ReadElement(ImplementerSearchModel model)
+		{
+			if (model == null)
+			{
+				throw new ArgumentNullException(nameof(model));
+			}
+			_logger.LogInformation("ReadElement. Id: {Id}", model.Id);
+			var element = _implementerStorage.GetElement(model);
+			if (element == null)
+			{
+				_logger.LogWarning("ReadElement element not found");
+				return null;
+			}
+			_logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
+			return element;
+		}
+		public bool Create(ImplementerBindingModel model)
+		{
+			CheckModel(model);
+			if (_implementerStorage.Insert(model) == null)
+			{
+				_logger.LogWarning("Insert operation failed");
+				return false;
+			}
+			return true;
+		}
+		public bool Update(ImplementerBindingModel model)
+		{
+			CheckModel(model);
+			if (_implementerStorage.Update(model) == null)
+			{
+				_logger.LogWarning("Update operation failed");
+				return false;
+			}
+			return true;
+		}
+		public bool Delete(ImplementerBindingModel model)
+		{
+			CheckModel(model, false);
+			_logger.LogInformation("Delete. Id:{Id}", model.Id);
+			if (_implementerStorage.Delete(model) == null)
+			{
+				_logger.LogWarning("Delete operation failed");
+				return false;
+			}
+			return true;
+		}
+		private void CheckModel(ImplementerBindingModel model, bool withParams = true)
+		{
+			if (model == null)
+			{
+				throw new ArgumentNullException(nameof(model));
+			}
+			if (!withParams)
+			{
+				return;
+			}
+			if (model.WorkExperience <= 0)
+			{
+				throw new ArgumentException("Опыт работы не должен быть меньше единицы", nameof(model.WorkExperience));
+			}
+			if (model.Qualification <= 0)
+			{
+				throw new ArgumentException("Квалификация не должна быть отрицательной", nameof(model.Qualification));
+			}
+			if (string.IsNullOrEmpty(model.Password))
+			{
+				throw new ArgumentNullException("Заполните пароль исполнителя", nameof(model.ImplementerFIO));
+			}
+			if (string.IsNullOrEmpty(model.ImplementerFIO))
+			{
+				throw new ArgumentNullException("Заполните ФИО исполнителя", nameof(model.ImplementerFIO));
+			}
+			_logger.LogInformation("Implementer. Id: {Id}, FIO: {FIO}", model.Id, model.ImplementerFIO);
+			var element = _implementerStorage.GetElement(new ImplementerSearchModel
+			{
+				ImplementerFIO = model.ImplementerFIO,
+			});
+			if (element != null && element.Id != model.Id)
+			{
+				throw new InvalidOperationException("Исполнитель с таким значением ФИО уже есть");
+			}
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShopBusinessLogic/OrderLogic.cs b/ComputersShop/ComputersShopBusinessLogic/OrderLogic.cs
index 07205f1..dfa1a6e 100644
--- a/ComputersShop/ComputersShopBusinessLogic/OrderLogic.cs
+++ b/ComputersShop/ComputersShopBusinessLogic/OrderLogic.cs
@@ -34,7 +34,23 @@ namespace ComputersShopBusinessLogic
             }
             return true;
         }
-        public bool StatusUpdate(OrderBindingModel model, OrderStatus newStatus)
+		public OrderViewModel? ReadElement(OrderSearchModel? model)
+		{
+			if (model == null)
+			{
+				throw new ArgumentNullException(nameof(model));
+			}
+			_logger.LogInformation("ReadElement. Id: {Id}", model.Id);
+			var element = _orderStorage.GetElement(model);
+			if (element == null)
+			{
+				_logger.LogWarning("ReadElement element not found");
+				return null;
+			}
+			_logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
+			return element;
+		}
+		public bool StatusUpdate(OrderBindingModel model, OrderStatus newStatus)
         {
             var viewModel = _orderStorage.GetElement(new OrderSearchModel { Id = model.Id });
             if (viewModel == null)
diff --git a/ComputersShop/ComputersShopBusinessLogic/WorkModeling.cs b/ComputersShop/ComputersShopBusinessLogic/WorkModeling.cs
new file mode 100644
index 0000000..651e4a1
--- /dev/null
+++ b/ComputersShop/ComputersShopBusinessLogic/WorkModeling.cs
@@ -0,0 +1,147 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.BusinessLogicsContracts;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Enums;
+using Microsoft.Extensions.Logging;
+
+namespace ComputersShopBusinessLogic
+{
+	public class WorkModeling : IWorkProcess
+	{
+		private readonly ILogger _logger;
+		private readonly Random _rnd;
+		private IOrderLogic? _orderLogic;
+		public WorkModeling(ILogger<WorkModeling> logger)
+		{
+			_logger = logger;
+			_rnd = new Random(1000);
+		}
+		public void DoWork(IImplementerLogic implementerLogic, IOrderLogic
+	   orderLogic)
+		{
+			_orderLogic = orderLogic;
+			var implementers = implementerLogic.ReadList(null);
+			if (implementers == null)
+			{
+				_logger.LogWarning("DoWork. Implementers is null");
+				return;
+			}
+			var orders = _orderLogic.ReadList(new OrderSearchModel
+			{
+				Status =
+		   OrderStatus.Принят
+			});
+			if (orders == null || orders.Count == 0)
+			{
+				_logger.LogWarning("DoWork. Orders is null or empty");
+				return;
+			}
+			_logger.LogDebug("DoWork for {Count} orders", orders.Count);
+			foreach (var implementer in implementers)
+			{
+				Task.Run(() => WorkerWorkAsync(implementer, orders));
+			}
+		}
+		/// <summary>
+		/// Иммитация работы исполнителя
+		/// </summary>
+		/// <param name="implementer"></param>
+		/// <param name="orders"></param>
+		private async Task WorkerWorkAsync(ImplementerViewModel implementer,
+	   List<OrderViewModel> orders)
+		{
+			if (_orderLogic == null || implementer == null)
+			{
+				return;
+			}
+			await RunOrderInWork(implementer);
+			await Task.Run(() =>
+			{
+				foreach (var order in orders)
+				{
+					try
+					{
+						_logger.LogDebug("DoWork. Worker {Id} try get order { Order} ", implementer.Id, order.Id);
+						// пытаемся назначить заказ на исполнителя
+						_orderLogic.TakeOrderInWork(new OrderBindingModel
+						{
+							Id = order.Id,
+							ImplementerId = implementer.Id
+						});
+						// делаем работу
+						Thread.Sleep(implementer.WorkExperience * _rnd.Next(100,
+						1000) * order.Count);
+						_logger.LogDebug("DoWork. Worker {Id} finish order { Order}", implementer.Id, order.Id);
+						_orderLogic.FinishOrder(new OrderBindingModel
+						{
+							Id = order.Id
+						});
+					}
+					// кто-то мог уже перехватить заказ, игнорируем ошибку
+					catch (InvalidOperationException ex)
+					{
+						_logger.LogWarning(ex, "Error try get work");
+					}
+					// заканчиваем выполнение имитации в случае иной ошибки
+					catch (Exception ex)
+					{
+						_logger.LogError(ex, "Error while do work");
+						throw;
+					}
+					// отдыхаем
+					Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
+				}
+			});
+		}
+		/// <summary>
+		/// Ищем заказ, которые уже в работе (вдруг исполнителя прервали)
+		/// </summary>
+		/// <param name="implementer"></param>
+		/// <returns></returns>
+		private async Task RunOrderInWork(ImplementerViewModel implementer)
+		{
+			if (_orderLogic == null || implementer == null)
+			{
+				return;
+			}
+			try
+			{
+				var runOrder = await Task.Run(() => _orderLogic.ReadElement(new
+			   OrderSearchModel
+				{
+					ImplementerId = implementer.Id,
+					Status = OrderStatus.Выполняется
+				}));
+				if (runOrder == null)
+				{
+					return;
+				}
+				_logger.LogDebug("DoWork. Worker {Id} back to order {Order}",
+			   implementer.Id, runOrder.Id);
+				// доделываем работу
+				Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) *
+			   runOrder.Count);
+				_logger.LogDebug("DoWork. Worker {Id} finish order {Order}",
+			   implementer.Id, runOrder.Id);
+				_orderLogic.FinishOrder(new OrderBindingModel
+				{
+					Id = runOrder.Id
+				});
+				// отдыхаем
+				Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
+			}
+			// заказа может не быть, просто игнорируем ошибку
+			catch (InvalidOperationException ex)
+			{
+				_logger.LogWarning(ex, "Error try get work");
+			}
+			// а может возникнуть иная ошибка, тогда просто заканчиваем выполнение имитации
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Error while do work");
+				throw;
+			}
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/BindingModels/ImplementerBindingModel.cs b/ComputersShop/ComputersShopContracts/BindingModels/ImplementerBindingModel.cs
new file mode 100644
index 0000000..79597f6
--- /dev/null
+++ b/ComputersShop/ComputersShopContracts/BindingModels/ImplementerBindingModel.cs
@@ -0,0 +1,13 @@
+using ComputersShopDataModels.Models;
+
+namespace ComputersShopContracts.BindingModels
+{
+	public class ImplementerBindingModel : IImplementerModel
+	{
+		public int Id { get; set; }
+		public string ImplementerFIO { get; set; } = string.Empty;
+		public string Password { get; set; } = string.Empty;
+		public int WorkExperience { get; set; }
+		public int Qualification { get; set;  }
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/BindingModels/OrderBindingModel.cs b/ComputersShop/ComputersShopContracts/BindingModels/OrderBindingModel.cs
index e29177a..744c0e7 100644
--- a/ComputersShop/ComputersShopContracts/BindingModels/OrderBindingModel.cs
+++ b/ComputersShop/ComputersShopContracts/BindingModels/OrderBindingModel.cs
@@ -13,5 +13,6 @@ namespace ComputersShopContracts.BindingModels
         public DateTime DateCreate { get; set; } = DateTime.Now;
         public DateTime? DateImplement { get; set; }
         public int ClientId { get; set; }
-    }
+		public int? ImplementerId { get; set; }
+	}
 }
diff --git a/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IImplementerLogic.cs b/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IImplementerLogic.cs
new file mode 100644
index 0000000..fd44c09
--- /dev/null
+++ b/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IImplementerLogic.cs
@@ -0,0 +1,15 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.ViewModels;
+
+namespace ComputersShopContracts.BusinessLogicsContracts
+{
+	public interface IImplementerLogic
+	{
+		List<ImplementerViewModel>? ReadList(ImplementerSearchModel? model);
+		ImplementerViewModel? ReadElement(ImplementerSearchModel model);
+		bool Create(ImplementerBindingModel model);
+		bool Update(ImplementerBindingModel model);
+		bool Delete(ImplementerBindingModel model);
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IOrderLogic.cs b/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IOrderLogic.cs
index 69b5886..71825c9 100644
--- a/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IOrderLogic.cs
+++ b/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IOrderLogic.cs
@@ -7,7 +7,8 @@ namespace ComputersShopContracts.BusinessLogicsContracts
     public interface IOrderLogic
     {
         List<OrderViewModel>? ReadList(OrderSearchModel? model);
-        bool CreateOrder(OrderBindingModel model);
+		OrderViewModel? ReadElement(OrderSearchModel? model);
+		bool CreateOrder(OrderBindingModel model);
         bool TakeOrderInWork(OrderBindingModel model);
         bool FinishOrder(OrderBindingModel model);
         bool DeliveryOrder(OrderBindingModel model);
diff --git a/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IWorkProcess.cs b/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IWorkProcess.cs
new file mode 100644
index 0000000..bdb6287
--- /dev/null
+++ b/ComputersShop/ComputersShopContracts/BusinessLogicsContracts/IWorkProcess.cs
@@ -0,0 +1,10 @@
+namespace ComputersShopContracts.BusinessLogicsContracts
+{
+	public interface IWorkProcess
+	{
+		/// <summary>
+		/// Запуск работ
+		/// </summary>
+		void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic);
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/SearchModels/ImplementerSearchModel.cs b/ComputersShop/ComputersShopContracts/SearchModels/ImplementerSearchModel.cs
new file mode 100644
index 0000000..9a1f492
--- /dev/null
+++ b/ComputersShop/ComputersShopContracts/SearchModels/ImplementerSearchModel.cs
@@ -0,0 +1,9 @@
+namespace ComputersShopContracts.SearchModels
+{
+	public class ImplementerSearchModel
+	{
+		public int? Id { get; set; }
+		public string? ImplementerFIO { get; set; }
+		public string? Password { get; set; }
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/SearchModels/OrderSearchModel.cs b/ComputersShop/ComputersShopContracts/SearchModels/OrderSearchModel.cs
index 938c3f3..c4faa50 100644
--- a/ComputersShop/ComputersShopContracts/SearchModels/OrderSearchModel.cs
+++ b/ComputersShop/ComputersShopContracts/SearchModels/OrderSearchModel.cs
@@ -1,4 +1,6 @@
-namespace ComputersShopContracts.SearchModels
+using ComputersShopDataModels.Enums;
+
+namespace ComputersShopContracts.SearchModels
 {
     public class OrderSearchModel
     {
@@ -6,5 +8,7 @@
         public DateTime? DateFrom { get; set; }
         public DateTime? DateTo { get; set;}
         public int? ClientId { get; set; }
-    }
+		public OrderStatus? Status { get; set; }
+		public int? ImplementerId { get; set; }
+	}
 }
diff --git a/ComputersShop/ComputersShopContracts/StoragesContracts/IImplementerStorage.cs b/ComputersShop/ComputersShopContracts/StoragesContracts/IImplementerStorage.cs
new file mode 100644
index 0000000..80329ca
--- /dev/null
+++ b/ComputersShop/ComputersShopContracts/StoragesContracts/IImplementerStorage.cs
@@ -0,0 +1,16 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.ViewModels;
+
+namespace ComputersShopContracts.StoragesContracts
+{
+	public interface IImplementerStorage
+	{
+		List<ImplementerViewModel> GetFullList();
+		List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model);
+		ImplementerViewModel? GetElement(ImplementerSearchModel model);
+		ImplementerViewModel? Insert(ImplementerBindingModel model);
+		ImplementerViewModel? Update(ImplementerBindingModel model);
+		ImplementerViewModel? Delete(ImplementerBindingModel model);
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/ViewModels/ImplementerViewModel.cs b/ComputersShop/ComputersShopContracts/ViewModels/ImplementerViewModel.cs
new file mode 100644
index 0000000..7589f16
--- /dev/null
+++ b/ComputersShop/ComputersShopContracts/ViewModels/ImplementerViewModel.cs
@@ -0,0 +1,17 @@
+using System.ComponentModel;
+
+namespace ComputersShopContracts.ViewModels
+{
+	public class ImplementerViewModel
+	{
+		public int Id { get; set; }
+		[DisplayName("Имя")]
+		public string ImplementerFIO { get; set; } = string.Empty;
+		[DisplayName("Пароль")]
+		public string Password { get; set; } = string.Empty;
+		[DisplayName("Опыт")]
+		public int WorkExperience { get; set; }
+		[DisplayName("Квалификация")]
+		public int Qualification { get; set; }
+	}
+}
diff --git a/ComputersShop/ComputersShopContracts/ViewModels/OrderViewModel.cs b/ComputersShop/ComputersShopContracts/ViewModels/OrderViewModel.cs
index 5e0a537..d381a0a 100644
--- a/ComputersShop/ComputersShopContracts/ViewModels/OrderViewModel.cs
+++ b/ComputersShop/ComputersShopContracts/ViewModels/OrderViewModel.cs
@@ -10,7 +10,8 @@ namespace ComputersShopContracts.ViewModels
         public int Id { get; set; }
         public int ComputerId { get; set; }
         public int ClientId { get; set; }
-        [DisplayName("Изделие")]
+		public int? ImplementerId { get; set; }
+		[DisplayName("Изделие")]
         public string ComputerName { get; set; } = string.Empty;
         [DisplayName("Количество")]
         public int Count { get; set; }
@@ -24,5 +25,7 @@ namespace ComputersShopContracts.ViewModels
         public DateTime? DateImplement { get; set; }
         [DisplayName("Клиент")]
         public string ClientFIO { get; set; } = string.Empty;
-    }
+		[DisplayName("Исполнитель")]
+		public string ImplementerFIO { get; set; } = string.Empty;
+	}
 }
diff --git a/ComputersShop/ComputersShopDataModels/Models/IImplementerModel.cs b/ComputersShop/ComputersShopDataModels/Models/IImplementerModel.cs
new file mode 100644
index 0000000..315674f
--- /dev/null
+++ b/ComputersShop/ComputersShopDataModels/Models/IImplementerModel.cs
@@ -0,0 +1,10 @@
+namespace ComputersShopDataModels.Models
+{
+	public interface IImplementerModel : IId
+	{
+		string ImplementerFIO { get; }
+		string Password { get; }
+		int WorkExperience { get; }
+		int Qualification { get; }
+	}
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/ComputersShopDatabase.cs b/ComputersShop/ComputersShopDatabaseImplement/ComputersShopDatabase.cs
index 9417ccf..61f35b7 100644
--- a/ComputersShop/ComputersShopDatabaseImplement/ComputersShopDatabase.cs
+++ b/ComputersShop/ComputersShopDatabaseImplement/ComputersShopDatabase.cs
@@ -26,5 +26,6 @@ namespace ComputersShopDatabaseImplement
         public virtual DbSet<ComputerComponent> ComputerComponents { set; get; }
         public virtual DbSet<Order> Orders { set; get; }
         public virtual DbSet<Client> Clients { set; get; }
-    }
+		public virtual DbSet<Implementer> Implementers { set; get; }
+	}
 }
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Implements/ImplementerStorage.cs b/ComputersShop/ComputersShopDatabaseImplement/Implements/ImplementerStorage.cs
new file mode 100644
index 0000000..522d5ae
--- /dev/null
+++ b/ComputersShop/ComputersShopDatabaseImplement/Implements/ImplementerStorage.cs
@@ -0,0 +1,87 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.StoragesContracts;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDatabaseImplement.Models;
+
+namespace ComputersShopDatabaseImplement.Implements
+{
+	public class ImplementerStorage : IImplementerStorage
+	{
+		public List<ImplementerViewModel> GetFullList()
+		{
+			using var context = new ComputersShopDatabase();
+			return context.Implementers.Select(x => x.GetViewModel).ToList();
+		}
+		public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
+		{
+			if (!model.Id.HasValue && string.IsNullOrEmpty(model.ImplementerFIO))
+			{
+				return new();
+			}
+			using var context = new ComputersShopDatabase();
+			if (model.Id.HasValue)
+			{
+				return context.Implementers
+					.Where(x => x.Id == model.Id)
+					.Select(x => x.GetViewModel)
+					.ToList();
+			}
+			return context.Implementers
+				.Where(x => x.ImplementerFIO == model.ImplementerFIO)
+				.Select(x => x.GetViewModel)
+				.ToList();
+		}
+		public ImplementerViewModel? GetElement(ImplementerSearchModel model)
+		{
+			if (!model.Id.HasValue && (string.IsNullOrEmpty(model.ImplementerFIO) || string.IsNullOrEmpty(model.Password)))
+			{
+				return new();
+			}
+			using var context = new ComputersShopDatabase();
+			if (model.Id.HasValue)//Сначала ищем по Id
+			{
+				return context.Implementers
+					.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
+			}
+			return context.Implementers//Затем по логину и паролю
+				.FirstOrDefault(x => x.ImplementerFIO == model.ImplementerFIO && x.Password == model.Password)?.GetViewModel;
+		}
+		public ImplementerViewModel? Insert(ImplementerBindingModel model)
+		{
+			using var context = new ComputersShopDatabase();
+			var newImplementer = Implementer.Create(model);
+			if (newImplementer == null)
+			{
+				return null;
+			}
+			context.Implementers.Add(newImplementer);
+			context.SaveChanges();
+			return newImplementer.GetViewModel;
+		}
+		public ImplementerViewModel? Update(ImplementerBindingModel model)
+		{
+			using var context = new ComputersShopDatabase();
+			var implementer = context.Implementers.FirstOrDefault(x => x.Id == model.Id);
+			if (implementer == null)
+			{
+				return null;
+			}
+			implementer.Update(model);
+			context.SaveChanges();
+			return implementer.GetViewModel;
+		}
+		public ImplementerViewModel? Delete(ImplementerBindingModel model)
+		{
+			using var context = new ComputersShopDatabase();
+			var implementer = context.Implementers.FirstOrDefault(x => x.Id == model.Id);
+			if (implementer == null)
+			{
+				return null;
+			}
+			context.Implementers.Remove(implementer);
+			context.SaveChanges();
+			return implementer.GetViewModel;
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Implements/OrderStorage.cs b/ComputersShop/ComputersShopDatabaseImplement/Implements/OrderStorage.cs
index 034b426..3c4f21f 100644
--- a/ComputersShop/ComputersShopDatabaseImplement/Implements/OrderStorage.cs
+++ b/ComputersShop/ComputersShopDatabaseImplement/Implements/OrderStorage.cs
@@ -15,6 +15,7 @@ namespace ComputersShopDatabaseImplement.Implements
 			using var context = new ComputersShopDatabase();
 			List<OrderViewModel> orderList = context.Orders
 				.Include(x => x.Client)
+				.Include(x => x.Implementer)
 				.Select(x => x.GetViewModel)
 				.ToList();
 			foreach (var order in orderList)
@@ -27,7 +28,7 @@ namespace ComputersShopDatabaseImplement.Implements
 		}
 		public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
 		{
-			if (!model.Id.HasValue && (!model.DateFrom.HasValue || !model.DateTo.HasValue) && !model.ClientId.HasValue)
+			if (!model.Id.HasValue && (!model.DateFrom.HasValue || !model.DateTo.HasValue) && !model.ClientId.HasValue && !model.ImplementerId.HasValue && !model.Status.HasValue)
 			{
 				return new();
 			}
@@ -37,6 +38,7 @@ namespace ComputersShopDatabaseImplement.Implements
 			{
 				orderList = context.Orders
 				.Where(x => x.Id == model.Id)
+				.Include(x => x.Implementer)
 				.Include(x => x.Client)
 				.Select(x => x.GetViewModel)
 				.ToList();
@@ -45,10 +47,20 @@ namespace ComputersShopDatabaseImplement.Implements
 			{
 				orderList = context.Orders
 				.Where(x => x.ClientId == model.ClientId)
+				.Include(x => x.Implementer)
 				.Include(x => x.Client)
 				.Select(x => x.GetViewModel)
 				.ToList();
 			}
+			else if (model.Status.HasValue) //далее ищем по статусу
+			{
+				orderList = context.Orders
+					.Where(x => x.Status == model.Status)
+					.Include(x => x.Client)
+					.Include(x => x.Implementer)
+					.Select(x => x.GetViewModel)
+					.ToList();
+			}
 			else
 			{
 				orderList = context.Orders
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.Designer.cs b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.Designer.cs
new file mode 100644
index 0000000..a44cc84
--- /dev/null
+++ b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.Designer.cs
@@ -0,0 +1,212 @@
+// <auto-generated />
+using System;
+using ComputersShopDatabaseImplement;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace ComputersShopDatabaseImplement.Migrations
+{
+    [DbContext(typeof(ComputersShopDatabase))]
+    [Migration("20230510052751_addImplementer")]
+    partial class addImplementer
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "7.0.4")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Client", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ClientFIO")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Clients");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Component", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ComponentName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<double>("Cost")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Components");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Computer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ComputerName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<double>("Price")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Computers");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.ComputerComponent", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<int>("ComponentId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("ComputerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ComponentId");
+
+                    b.HasIndex("ComputerId");
+
+                    b.ToTable("ComputerComponents");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Order", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<int>("ClientId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("ComputerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("DateCreate")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DateImplement")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<double>("Sum")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ClientId");
+
+                    b.HasIndex("ComputerId");
+
+                    b.ToTable("Orders");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.ComputerComponent", b =>
+                {
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Component", "Component")
+                        .WithMany("ComputerComponents")
+                        .HasForeignKey("ComponentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Computer", "Computer")
+                        .WithMany("Components")
+                        .HasForeignKey("ComputerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Component");
+
+                    b.Navigation("Computer");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Order", b =>
+                {
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Client", "Client")
+                        .WithMany("Orders")
+                        .HasForeignKey("ClientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Computer", null)
+                        .WithMany("Orders")
+                        .HasForeignKey("ComputerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Client");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Client", b =>
+                {
+                    b.Navigation("Orders");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Component", b =>
+                {
+                    b.Navigation("ComputerComponents");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Computer", b =>
+                {
+                    b.Navigation("Components");
+
+                    b.Navigation("Orders");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.cs b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.cs
new file mode 100644
index 0000000..f30f64f
--- /dev/null
+++ b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510052751_addImplementer.cs
@@ -0,0 +1,22 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace ComputersShopDatabaseImplement.Migrations
+{
+    /// <inheritdoc />
+    public partial class addImplementer : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+
+        }
+    }
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.Designer.cs b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.Designer.cs
new file mode 100644
index 0000000..bc7b845
--- /dev/null
+++ b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.Designer.cs
@@ -0,0 +1,255 @@
+// <auto-generated />
+using System;
+using ComputersShopDatabaseImplement;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace ComputersShopDatabaseImplement.Migrations
+{
+    [DbContext(typeof(ComputersShopDatabase))]
+    [Migration("20230510055946_add-implementer")]
+    partial class addimplementer
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "7.0.4")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Client", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ClientFIO")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Clients");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Component", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ComponentName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<double>("Cost")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Components");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Computer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ComputerName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<double>("Price")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Computers");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.ComputerComponent", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<int>("ComponentId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("ComputerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ComponentId");
+
+                    b.HasIndex("ComputerId");
+
+                    b.ToTable("ComputerComponents");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Implementer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ImplementerFIO")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Qualification")
+                        .HasColumnType("int");
+
+                    b.Property<int>("WorkExperience")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Implementers");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Order", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<int>("ClientId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("ComputerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("DateCreate")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DateImplement")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("ImplementerId")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<double>("Sum")
+                        .HasColumnType("float");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ClientId");
+
+                    b.HasIndex("ComputerId");
+
+                    b.HasIndex("ImplementerId");
+
+                    b.ToTable("Orders");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.ComputerComponent", b =>
+                {
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Component", "Component")
+                        .WithMany("ComputerComponents")
+                        .HasForeignKey("ComponentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Computer", "Computer")
+                        .WithMany("Components")
+                        .HasForeignKey("ComputerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Component");
+
+                    b.Navigation("Computer");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Order", b =>
+                {
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Client", "Client")
+                        .WithMany("Orders")
+                        .HasForeignKey("ClientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Computer", null)
+                        .WithMany("Orders")
+                        .HasForeignKey("ComputerId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Implementer", "Implementer")
+                        .WithMany("Orders")
+                        .HasForeignKey("ImplementerId");
+
+                    b.Navigation("Client");
+
+                    b.Navigation("Implementer");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Client", b =>
+                {
+                    b.Navigation("Orders");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Component", b =>
+                {
+                    b.Navigation("ComputerComponents");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Computer", b =>
+                {
+                    b.Navigation("Components");
+
+                    b.Navigation("Orders");
+                });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Implementer", b =>
+                {
+                    b.Navigation("Orders");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.cs b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.cs
new file mode 100644
index 0000000..8152957
--- /dev/null
+++ b/ComputersShop/ComputersShopDatabaseImplement/Migrations/20230510055946_add-implementer.cs
@@ -0,0 +1,67 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace ComputersShopDatabaseImplement.Migrations
+{
+    /// <inheritdoc />
+    public partial class addimplementer : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<int>(
+                name: "ImplementerId",
+                table: "Orders",
+                type: "int",
+                nullable: true);
+
+            migrationBuilder.CreateTable(
+                name: "Implementers",
+                columns: table => new
+                {
+                    Id = table.Column<int>(type: "int", nullable: false)
+                        .Annotation("SqlServer:Identity", "1, 1"),
+                    ImplementerFIO = table.Column<string>(type: "nvarchar(max)", nullable: false),
+                    Password = table.Column<string>(type: "nvarchar(max)", nullable: false),
+                    WorkExperience = table.Column<int>(type: "int", nullable: false),
+                    Qualification = table.Column<int>(type: "int", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_Implementers", x => x.Id);
+                });
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Orders_ImplementerId",
+                table: "Orders",
+                column: "ImplementerId");
+
+            migrationBuilder.AddForeignKey(
+                name: "FK_Orders_Implementers_ImplementerId",
+                table: "Orders",
+                column: "ImplementerId",
+                principalTable: "Implementers",
+                principalColumn: "Id");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_Orders_Implementers_ImplementerId",
+                table: "Orders");
+
+            migrationBuilder.DropTable(
+                name: "Implementers");
+
+            migrationBuilder.DropIndex(
+                name: "IX_Orders_ImplementerId",
+                table: "Orders");
+
+            migrationBuilder.DropColumn(
+                name: "ImplementerId",
+                table: "Orders");
+        }
+    }
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Migrations/ComputersShopDatabaseModelSnapshot.cs b/ComputersShop/ComputersShopDatabaseImplement/Migrations/ComputersShopDatabaseModelSnapshot.cs
index 27e603c..02a8253 100644
--- a/ComputersShop/ComputersShopDatabaseImplement/Migrations/ComputersShopDatabaseModelSnapshot.cs
+++ b/ComputersShop/ComputersShopDatabaseImplement/Migrations/ComputersShopDatabaseModelSnapshot.cs
@@ -113,6 +113,33 @@ namespace ComputersShopDatabaseImplement.Migrations
                     b.ToTable("ComputerComponents");
                 });
 
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Implementer", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
+
+                    b.Property<string>("ImplementerFIO")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Password")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Qualification")
+                        .HasColumnType("int");
+
+                    b.Property<int>("WorkExperience")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Implementers");
+                });
+
             modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Order", b =>
                 {
                     b.Property<int>("Id")
@@ -136,6 +163,9 @@ namespace ComputersShopDatabaseImplement.Migrations
                     b.Property<DateTime?>("DateImplement")
                         .HasColumnType("datetime2");
 
+                    b.Property<int?>("ImplementerId")
+                        .HasColumnType("int");
+
                     b.Property<int>("Status")
                         .HasColumnType("int");
 
@@ -148,6 +178,8 @@ namespace ComputersShopDatabaseImplement.Migrations
 
                     b.HasIndex("ComputerId");
 
+                    b.HasIndex("ImplementerId");
+
                     b.ToTable("Orders");
                 });
 
@@ -184,7 +216,13 @@ namespace ComputersShopDatabaseImplement.Migrations
                         .OnDelete(DeleteBehavior.Cascade)
                         .IsRequired();
 
+                    b.HasOne("ComputersShopDatabaseImplement.Models.Implementer", "Implementer")
+                        .WithMany("Orders")
+                        .HasForeignKey("ImplementerId");
+
                     b.Navigation("Client");
+
+                    b.Navigation("Implementer");
                 });
 
             modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Client", b =>
@@ -203,6 +241,11 @@ namespace ComputersShopDatabaseImplement.Migrations
 
                     b.Navigation("Orders");
                 });
+
+            modelBuilder.Entity("ComputersShopDatabaseImplement.Models.Implementer", b =>
+                {
+                    b.Navigation("Orders");
+                });
 #pragma warning restore 612, 618
         }
     }
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Models/Implementer.cs b/ComputersShop/ComputersShopDatabaseImplement/Models/Implementer.cs
new file mode 100644
index 0000000..4a17387
--- /dev/null
+++ b/ComputersShop/ComputersShopDatabaseImplement/Models/Implementer.cs
@@ -0,0 +1,58 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Models;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.ComponentModel.DataAnnotations;
+
+namespace ComputersShopDatabaseImplement.Models
+{
+	public class Implementer : IImplementerModel
+	{
+		public int Id { get; private set; }
+		[Required]
+		public string ImplementerFIO { get; private set; } = string.Empty;
+		[Required]
+		public string Password { get; private set; } = string.Empty;
+		[Required]
+		public int WorkExperience { get; private set; }
+		[Required]
+		public int Qualification { get; private set; }
+		//Привязываем исполнителя к заказам один ко многим
+		[ForeignKey("ImplementerId")]
+		public virtual List<Order> Orders { get; private set; } = new();
+		public static Implementer? Create(ImplementerBindingModel model)
+		{
+			if (model == null)
+			{
+				return null;
+			}
+			return new()
+			{
+				Id = model.Id,
+				Password = model.Password,
+				Qualification = model.Qualification,
+				ImplementerFIO = model.ImplementerFIO,
+				WorkExperience = model.WorkExperience,
+			};
+		}
+		public void Update(ImplementerBindingModel model)
+		{
+			if (model == null)
+			{
+				return;
+			}
+			Password = model.Password;
+			Qualification = model.Qualification;
+			ImplementerFIO = model.ImplementerFIO;
+			WorkExperience = model.WorkExperience;
+		}
+		public ImplementerViewModel GetViewModel => new()
+		{
+			Id = Id,
+			Password = Password,
+			Qualification = Qualification,
+			ImplementerFIO = ImplementerFIO,
+			WorkExperience = WorkExperience,
+		};
+	}
+}
diff --git a/ComputersShop/ComputersShopDatabaseImplement/Models/Order.cs b/ComputersShop/ComputersShopDatabaseImplement/Models/Order.cs
index 86055c8..61997e0 100644
--- a/ComputersShop/ComputersShopDatabaseImplement/Models/Order.cs
+++ b/ComputersShop/ComputersShopDatabaseImplement/Models/Order.cs
@@ -23,9 +23,11 @@ namespace ComputersShopDatabaseImplement.Models
         [Required]
         public int ClientId { get; private set; }
         [Required]
-        public virtual Client? Client { get; set; } 
+        public virtual Client? Client { get; set; }
+		public int? ImplementerId { get; private set; }
+		public virtual Implementer? Implementer { get; private set; }
 
-        public static Order? Create(OrderBindingModel model)
+		public static Order? Create(OrderBindingModel model)
         {
             if (model == null)
             {
@@ -40,8 +42,9 @@ namespace ComputersShopDatabaseImplement.Models
                 Status = model.Status,
                 DateCreate = model.DateCreate,
                 DateImplement = model.DateImplement,
-                ClientId = model.ClientId
-            };
+                ClientId = model.ClientId,
+				ImplementerId = model.ImplementerId
+			};
         }
         public static Order Create(OrderViewModel model)
         {
@@ -63,10 +66,16 @@ namespace ComputersShopDatabaseImplement.Models
                 return;
             }
             Status = model.Status;
-            if (model.DateImplement != null)
+
+			if (model.ImplementerId != null)
+			{
+				ImplementerId = model.ImplementerId;
+			}
+			if (model.DateImplement != null)
             {
                 DateImplement = model.DateImplement;
             }
+
         }
         public OrderViewModel GetViewModel => new()
         {
@@ -78,7 +87,9 @@ namespace ComputersShopDatabaseImplement.Models
             DateCreate = DateCreate,
             DateImplement = DateImplement,
             ClientId = ClientId,
-            ClientFIO = Client?.ClientFIO ?? string.Empty
-        };
+            ClientFIO = Client?.ClientFIO ?? string.Empty,
+            ImplementerId = ImplementerId,
+			ImplementerFIO = Implementer?.ImplementerFIO ?? string.Empty,
+		};
     }
 }
diff --git a/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs b/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs
index b81e05e..df5ece0 100644
--- a/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs
+++ b/ComputersShop/ComputersShopFileImplement/DataFileSingleton.cs
@@ -11,11 +11,13 @@ namespace ComputersShopFileImplement
         private readonly string OrderFileName = "Order.xml";
         private readonly string ComputerFileName = "Computer.xml";
         private readonly string ClientFileName = "Client.xml";
-        public List<Component> Components { get; private set; }
+		private readonly string ImplementerFileName = "Implementer.xml";
+		public List<Component> Components { get; private set; }
         public List<Order> Orders { get; private set; }
         public List<Computer> Computers { get; private set; }
         public List<Client> Clients { get; private set; }
-        public static DataFileSingleton GetInstance()
+		public List<Implementer> Implementers { get; private set; }
+		public static DataFileSingleton GetInstance()
         {
             if (instance == null)
             {
@@ -27,13 +29,15 @@ namespace ComputersShopFileImplement
         public void SaveComputers() => SaveData(Computers, ComputerFileName, "Computers", x => x.GetXElement);
         public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
         public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement);
-        private DataFileSingleton()
+		public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement);
+		private DataFileSingleton()
         {
             Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
             Computers = LoadData(ComputerFileName, "Computer", x => Computer.Create(x)!)!;
             Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
             Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!;
-        }
+			Implementers = LoadData(ImplementerFileName, "I", x => Implementer.Create(x)!)!;
+		}
         private static List<T>? LoadData<T>(string filename, string xmlNodeName,
        Func<XElement, T> selectFunction)
         {
diff --git a/ComputersShop/ComputersShopFileImplement/Implements/ImplementerStorage.cs b/ComputersShop/ComputersShopFileImplement/Implements/ImplementerStorage.cs
new file mode 100644
index 0000000..45ed1ea
--- /dev/null
+++ b/ComputersShop/ComputersShopFileImplement/Implements/ImplementerStorage.cs
@@ -0,0 +1,88 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.StoragesContracts;
+using ComputersShopContracts.ViewModels;
+using ComputersShopFileImplement.Models;
+
+namespace ComputersShopFileImplement.Implements
+{
+	public class ImplementerStorage : IImplementerStorage
+	{
+		private readonly DataFileSingleton _source;
+		public ImplementerStorage()
+		{
+			_source = DataFileSingleton.GetInstance();
+		}
+		public ImplementerViewModel? Delete(ImplementerBindingModel model)
+		{
+			var res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id);
+			if (res != null)
+			{
+				_source.Implementers.Remove(res);
+				_source.SaveImplementers();
+			}
+			return res?.GetViewModel;
+		}
+		public ImplementerViewModel? GetElement(ImplementerSearchModel model)
+		{
+			if (!model.Id.HasValue && (string.IsNullOrEmpty(model.ImplementerFIO) || string.IsNullOrEmpty(model.Password)))
+			{
+				return new();
+			}
+			if (model.Id.HasValue)//Сначала ищем по Id
+			{
+				return _source.Implementers
+					.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
+			}
+			return _source.Implementers//Затем по логину и паролю
+				.FirstOrDefault(x => x.ImplementerFIO == model.ImplementerFIO && x.Password == model.Password)?.GetViewModel;
+		}
+
+		public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
+		{
+			if (!model.Id.HasValue && string.IsNullOrEmpty(model.ImplementerFIO))
+			{
+				return new();
+			}
+			if (model.Id.HasValue)
+			{
+				return _source.Implementers
+					.Where(x => x.Id == model.Id)
+					.Select(x => x.GetViewModel)
+					.ToList();
+			}
+			return _source.Implementers
+				.Where(x => x.ImplementerFIO == model.ImplementerFIO)
+				.Select(x => x.GetViewModel)
+				.ToList();
+		}
+
+		public List<ImplementerViewModel> GetFullList()
+		{
+			return _source.Implementers.Select(x => x.GetViewModel).ToList();
+		}
+
+		public ImplementerViewModel? Insert(ImplementerBindingModel model)
+		{
+			model.Id = _source.Implementers.Count > 0 ? _source.Implementers.Max(x => x.Id) + 1 : 1;
+			var res = Implementer.Create(model);
+			if (res != null)
+			{
+				_source.Implementers.Add(res);
+				_source.SaveImplementers();
+			}
+			return res?.GetViewModel;
+		}
+
+		public ImplementerViewModel? Update(ImplementerBindingModel model)
+		{
+			var res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id);
+			if (res != null)
+			{
+				res.Update(model);
+				_source.SaveImplementers();
+			}
+			return res?.GetViewModel;
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShopFileImplement/Models/Implementer.cs b/ComputersShop/ComputersShopFileImplement/Models/Implementer.cs
new file mode 100644
index 0000000..7431fc9
--- /dev/null
+++ b/ComputersShop/ComputersShopFileImplement/Models/Implementer.cs
@@ -0,0 +1,76 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace ComputersShopFileImplement.Models
+{
+	internal class Implementer : IImplementerModel
+	{
+		public int Id { get; private set; }
+		public string ImplementerFIO { get; private set; } = string.Empty;
+		public string Password { get; private set; } = string.Empty;
+		public int WorkExperience { get; private set; }
+		public int Qualification { get; private set; }
+		public static Implementer? Create(XElement element)
+		{
+			if (element == null)
+			{
+				return null;
+			}
+			return new()
+			{
+				ImplementerFIO = element.Element("FIO")!.Value,
+				Password = element.Element("Password")!.Value,
+				Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+				Qualification = Convert.ToInt32(element.Element("Qualification")!.Value),
+				WorkExperience = Convert.ToInt32(element.Element("WorkExperience")!.Value),
+			};
+		}
+		public static Implementer? Create(ImplementerBindingModel model)
+		{
+			if (model == null)
+			{
+				return null;
+			}
+			return new()
+			{
+				Id = model.Id,
+				Password = model.Password,
+				Qualification = model.Qualification,
+				ImplementerFIO = model.ImplementerFIO,
+				WorkExperience = model.WorkExperience,
+			};
+		}
+		public void Update(ImplementerBindingModel model)
+		{
+			if (model == null)
+			{
+				return;
+			}
+			Password = model.Password;
+			Qualification = model.Qualification;
+			ImplementerFIO = model.ImplementerFIO;
+			WorkExperience = model.WorkExperience;
+		}
+		public ImplementerViewModel GetViewModel => new()
+		{
+			Id = Id,
+			Password = Password,
+			Qualification = Qualification,
+			ImplementerFIO = ImplementerFIO,
+		};
+		public XElement GetXElement => new("Client",
+			new XAttribute("Id", Id),
+			new XElement("Password", Password),
+			new XElement("FIO", ImplementerFIO),
+			new XElement("Qualification", Qualification),
+			new XElement("WorkExperience", WorkExperience)
+			);
+	}
+}
diff --git a/ComputersShop/ComputersShopImplement/DataListSingleton.cs b/ComputersShop/ComputersShopImplement/DataListSingleton.cs
index 06ebdfa..cdd976e 100644
--- a/ComputersShop/ComputersShopImplement/DataListSingleton.cs
+++ b/ComputersShop/ComputersShopImplement/DataListSingleton.cs
@@ -9,13 +9,15 @@ namespace ComputersShopListImplement
         public List<Order> Orders { get; set; }
         public List<Computer> Computers { get; set; }
         public List<Client> Clients { get; set; }
-        private DataListSingleton()
+		public List<Implementer> Implementers { get; set; }
+		private DataListSingleton()
         {
             Components = new List<Component>();
             Orders = new List<Order>();
             Computers = new List<Computer>();
             Clients = new List<Client>();
-        }
+			Implementers = new List<Implementer>();
+		}
         public static DataListSingleton GetInstance()
         {
             if (_instance == null)
diff --git a/ComputersShop/ComputersShopImplement/Implements/ImplementerStorage.cs b/ComputersShop/ComputersShopImplement/Implements/ImplementerStorage.cs
new file mode 100644
index 0000000..42515d2
--- /dev/null
+++ b/ComputersShop/ComputersShopImplement/Implements/ImplementerStorage.cs
@@ -0,0 +1,119 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.StoragesContracts;
+using ComputersShopContracts.ViewModels;
+using ComputersShopListImplement.Models;
+
+namespace ComputersShopListImplement.Implements
+{
+	public class ImplementerStorage : IImplementerStorage
+	{
+		private readonly DataListSingleton _source;
+		public ImplementerStorage()
+		{
+			_source = DataListSingleton.GetInstance();
+		}
+		public ImplementerViewModel? Delete(ImplementerBindingModel model)
+		{
+			for (int i = 0; i < _source.Implementers.Count; ++i)
+			{
+				if (_source.Implementers[i].Id == model.Id)
+				{
+					var element = _source.Implementers[i];
+					_source.Implementers.RemoveAt(i);
+					return element.GetViewModel;
+				}
+			}
+			return null;
+		}
+		public ImplementerViewModel? GetElement(ImplementerSearchModel model)
+		{
+			foreach (var implementer in _source.Implementers)
+			{
+				if (model.Id.HasValue && implementer.Id == model.Id)
+				{
+					return implementer.GetViewModel;
+				}
+				if (model.ImplementerFIO != null && model.Password != null && implementer.ImplementerFIO.Equals(model.ImplementerFIO) && implementer.Password.Equals(model.Password))
+				{
+					return implementer.GetViewModel;
+				}
+				if (model.ImplementerFIO != null && implementer.ImplementerFIO.Equals(model.ImplementerFIO))
+				{
+					return implementer.GetViewModel;
+				}
+			}
+			return null;
+		}
+		public List<ImplementerViewModel> GetFilteredList(ImplementerSearchModel model)
+		{
+			var result = new List<ImplementerViewModel>();
+			if (!model.Id.HasValue && string.IsNullOrEmpty(model.ImplementerFIO))
+			{
+				return result;
+			}
+			if (model.Id.HasValue)
+			{
+				foreach (var implementer in _source.Implementers)
+				{
+					if (implementer.Id == model.Id)
+					{
+						result.Add(implementer.GetViewModel);
+					}
+				}
+				return result;
+			}
+			else
+			{
+				foreach (var implementer in _source.Implementers)
+				{
+					if (implementer.ImplementerFIO == model.ImplementerFIO)
+					{
+						result.Add(implementer.GetViewModel);
+					}
+				}
+				return result;
+			}
+		}
+
+		public List<ImplementerViewModel> GetFullList()
+		{
+			var result = new List<ImplementerViewModel>();
+			foreach (var implementer in _source.Implementers)
+			{
+				result.Add(implementer.GetViewModel);
+			}
+			return result;
+		}
+
+		public ImplementerViewModel? Insert(ImplementerBindingModel model)
+		{
+			model.Id = 1;
+			foreach (var implementer in _source.Implementers)
+			{
+				if (model.Id <= implementer.Id)
+				{
+					model.Id = implementer.Id + 1;
+				}
+			}
+			var res = Implementer.Create(model);
+			if (res != null)
+			{
+				_source.Implementers.Add(res);
+			}
+			return res?.GetViewModel;
+		}
+		public ImplementerViewModel? Update(ImplementerBindingModel model)
+		{
+			foreach (var implementer in _source.Implementers)
+			{
+				if (implementer.Id == model.Id)
+				{
+					implementer.Update(model);
+					return implementer.GetViewModel;
+				}
+			}
+			return null;
+		}
+	}
+}
diff --git a/ComputersShop/ComputersShopImplement/Models/Implementer.cs b/ComputersShop/ComputersShopImplement/Models/Implementer.cs
new file mode 100644
index 0000000..06e9cf7
--- /dev/null
+++ b/ComputersShop/ComputersShopImplement/Models/Implementer.cs
@@ -0,0 +1,48 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Models;
+
+namespace ComputersShopListImplement.Models
+{
+	public class Implementer : IImplementerModel
+	{
+		public int Id { get; private set; }
+		public string ImplementerFIO { get; private set; } = string.Empty;
+		public string Password { get; private set; } = string.Empty;
+		public int WorkExperience { get; private set; }
+		public int Qualification { get; private set; }
+		public static Implementer? Create(ImplementerBindingModel model)
+		{
+			if (model == null)
+			{
+				return null;
+			}
+			return new()
+			{
+				Id = model.Id,
+				Password = model.Password,
+				Qualification = model.Qualification,
+				ImplementerFIO = model.ImplementerFIO,
+				WorkExperience = model.WorkExperience,
+			};
+		}
+		public void Update(ImplementerBindingModel model)
+		{
+			if (model == null)
+			{
+				return;
+			}
+			Password = model.Password;
+			Qualification = model.Qualification;
+			ImplementerFIO = model.ImplementerFIO;
+			WorkExperience = model.WorkExperience;
+		}
+		public ImplementerViewModel GetViewModel => new()
+		{
+			Id = Id,
+			Password = Password,
+			Qualification = Qualification,
+			ImplementerFIO = ImplementerFIO,
+		};
+	}
+}
diff --git a/ComputersShop/ComputersShopRestApi/Controllers/ImplementerController.cs b/ComputersShop/ComputersShopRestApi/Controllers/ImplementerController.cs
new file mode 100644
index 0000000..4df716f
--- /dev/null
+++ b/ComputersShop/ComputersShopRestApi/Controllers/ImplementerController.cs
@@ -0,0 +1,103 @@
+using ComputersShopContracts.BindingModels;
+using ComputersShopContracts.BusinessLogicsContracts;
+using ComputersShopContracts.SearchModels;
+using ComputersShopContracts.ViewModels;
+using ComputersShopDataModels.Enums;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using Microsoft.AspNetCore.Mvc;
+
+namespace ComputersShopRestApi.Controllers
+{
+	[Route("api/[controller]/[action]")]
+	[ApiController]
+	public class ImplementerController : Controller
+	{
+		private readonly ILogger _logger;
+		private readonly IOrderLogic _order;
+		private readonly IImplementerLogic _logic;
+		public ImplementerController(IOrderLogic order, IImplementerLogic logic,
+	   ILogger<ImplementerController> logger)
+		{
+			_logger = logger;
+			_order = order;
+			_logic = logic;
+		}
+		[HttpGet]
+		public ImplementerViewModel? Login(string login, string password)
+		{
+			try
+			{
+				return _logic.ReadElement(new ImplementerSearchModel
+				{
+					ImplementerFIO = login,
+					Password = password
+				});
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка авторизации сотрудника");
+				throw;
+			}
+		}
+		[HttpGet]
+		public List<OrderViewModel>? GetNewOrders()
+		{
+			try
+			{
+				return _order.ReadList(new OrderSearchModel
+				{
+					Status = OrderStatus.Принят
+				});
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка получения новых заказов");
+				throw;
+			}
+		}
+		[HttpGet]
+		public OrderViewModel? GetImplementerOrder(int implementerId)
+		{
+			try
+			{
+				return _order.ReadElement(new OrderSearchModel
+				{
+					ImplementerId = implementerId
+				});
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка получения текущего заказа исполнителя");
+			   
+				throw;
+			}
+		}
+		[HttpPost]
+		public void TakeOrderInWork(OrderBindingModel model)
+		{
+			try
+			{
+				_order.TakeOrderInWork(model);
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка перевода заказа с №{Id} в работу",
+			   model.Id);
+				throw;
+			}
+		}
+		[HttpPost]
+		public void FinishOrder(OrderBindingModel model)
+		{
+			try
+			{
+				_order.FinishOrder(model);
+			}
+			catch (Exception ex)
+			{
+				_logger.LogError(ex, "Ошибка отметки о готовности заказа с №{ Id}", model.Id);
+		    throw;
+			}
+		}
+	}
+}