diff --git a/PIbd-23_Gutorov_I.A._IT-Company/FormItCompany.Designer.cs b/PIbd-23_Gutorov_I.A._IT-Company/FormItCompany.Designer.cs index 75930b7..b70d236 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/FormItCompany.Designer.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/FormItCompany.Designer.cs @@ -29,31 +29,32 @@ private void InitializeComponent() { menuStrip = new MenuStrip(); - справочникиToolStripMenuItem = new ToolStripMenuItem(); + EntitiesToolStripMenuItem = new ToolStripMenuItem(); CustomersToolStripMenuItem = new ToolStripMenuItem(); ExecutorsToolStripMenuItem = new ToolStripMenuItem(); - операцииToolStripMenuItem = new ToolStripMenuItem(); + ServicesToolStripMenuItem = new ToolStripMenuItem(); + OperationsToolStripMenuItem = new ToolStripMenuItem(); CustomerContractReviewsToolStripMenuItem = new ToolStripMenuItem(); - контрактыToolStripMenuItem = new ToolStripMenuItem(); - отчетыToolStripMenuItem = new ToolStripMenuItem(); + ContractsToolStripMenuItem = new ToolStripMenuItem(); + ReportsToolStripMenuItem = new ToolStripMenuItem(); menuStrip.SuspendLayout(); SuspendLayout(); // // menuStrip // - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчетыToolStripMenuItem }); + menuStrip.Items.AddRange(new ToolStripItem[] { EntitiesToolStripMenuItem, OperationsToolStripMenuItem, ReportsToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; menuStrip.Size = new Size(734, 24); menuStrip.TabIndex = 0; menuStrip.Text = "menuStrip1"; // - // справочникиToolStripMenuItem + // EntitiesToolStripMenuItem // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { CustomersToolStripMenuItem, ExecutorsToolStripMenuItem }); - справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(94, 20); - справочникиToolStripMenuItem.Text = "Справочники"; + EntitiesToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { CustomersToolStripMenuItem, ExecutorsToolStripMenuItem, ServicesToolStripMenuItem }); + EntitiesToolStripMenuItem.Name = "EntitiesToolStripMenuItem"; + EntitiesToolStripMenuItem.Size = new Size(94, 20); + EntitiesToolStripMenuItem.Text = "Справочники"; // // CustomersToolStripMenuItem // @@ -69,12 +70,19 @@ ExecutorsToolStripMenuItem.Text = "Исполнители"; ExecutorsToolStripMenuItem.Click += ExecutorsToolStripMenuItem_Click; // - // операцииToolStripMenuItem + // ServicesToolStripMenuItem // - операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { CustomerContractReviewsToolStripMenuItem, контрактыToolStripMenuItem }); - операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; - операцииToolStripMenuItem.Size = new Size(75, 20); - операцииToolStripMenuItem.Text = "Операции"; + ServicesToolStripMenuItem.Name = "ServicesToolStripMenuItem"; + ServicesToolStripMenuItem.Size = new Size(180, 22); + ServicesToolStripMenuItem.Text = "Услуги"; + ServicesToolStripMenuItem.Click += ServicesToolStripMenuItem_Click; + // + // OperationsToolStripMenuItem + // + OperationsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { CustomerContractReviewsToolStripMenuItem, ContractsToolStripMenuItem }); + OperationsToolStripMenuItem.Name = "OperationsToolStripMenuItem"; + OperationsToolStripMenuItem.Size = new Size(75, 20); + OperationsToolStripMenuItem.Text = "Операции"; // // CustomerContractReviewsToolStripMenuItem // @@ -83,18 +91,18 @@ CustomerContractReviewsToolStripMenuItem.Text = "Отзывы заказчиков"; CustomerContractReviewsToolStripMenuItem.Click += CustomerContractReviewsToolStripMenuItem_Click; // - // контрактыToolStripMenuItem + // ContractsToolStripMenuItem // - контрактыToolStripMenuItem.Name = "контрактыToolStripMenuItem"; - контрактыToolStripMenuItem.Size = new Size(181, 22); - контрактыToolStripMenuItem.Text = "Контракты"; - контрактыToolStripMenuItem.Click += ContractsToolStripMenuItem_Click; + ContractsToolStripMenuItem.Name = "ContractsToolStripMenuItem"; + ContractsToolStripMenuItem.Size = new Size(181, 22); + ContractsToolStripMenuItem.Text = "Контракты"; + ContractsToolStripMenuItem.Click += ContractsToolStripMenuItem_Click; // - // отчетыToolStripMenuItem + // ReportsToolStripMenuItem // - отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - отчетыToolStripMenuItem.Size = new Size(60, 20); - отчетыToolStripMenuItem.Text = "Отчеты"; + ReportsToolStripMenuItem.Name = "ReportsToolStripMenuItem"; + ReportsToolStripMenuItem.Size = new Size(60, 20); + ReportsToolStripMenuItem.Text = "Отчеты"; // // FormItCompany // @@ -117,13 +125,13 @@ #endregion private MenuStrip menuStrip; - private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem EntitiesToolStripMenuItem; private ToolStripMenuItem CustomersToolStripMenuItem; private ToolStripMenuItem ExecutorsToolStripMenuItem; - private ToolStripMenuItem операцииToolStripMenuItem; - private ToolStripMenuItem отчетыToolStripMenuItem; + private ToolStripMenuItem OperationsToolStripMenuItem; + private ToolStripMenuItem ReportsToolStripMenuItem; private ToolStripMenuItem CustomerContractReviewsToolStripMenuItem; - private ToolStripMenuItem контрактыToolStripMenuItem; + private ToolStripMenuItem ContractsToolStripMenuItem; private ToolStripMenuItem ServicesToolStripMenuItem; } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.Designer.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.Designer.cs index 165e71c..e694e67 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.Designer.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.Designer.cs @@ -41,8 +41,8 @@ labelContractDeadline = new Label(); labelContractPaymentAmount = new Label(); dataGridViewServices = new DataGridView(); + ColumnServiceDescription = new DataGridViewComboBoxColumn(); groupBox = new GroupBox(); - ColumnServiceDescription = new DataGridViewTextBoxColumn(); ((System.ComponentModel.ISupportInitialize)numericUpDownContractPaymentAmount).BeginInit(); ((System.ComponentModel.ISupportInitialize)dataGridViewServices).BeginInit(); groupBox.SuspendLayout(); @@ -172,6 +172,14 @@ dataGridViewServices.Size = new Size(352, 244); dataGridViewServices.TabIndex = 17; // + // ColumnServiceDescription + // + ColumnServiceDescription.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + ColumnServiceDescription.HeaderText = "Услуга"; + ColumnServiceDescription.Name = "ColumnServiceDescription"; + ColumnServiceDescription.Resizable = DataGridViewTriState.True; + ColumnServiceDescription.SortMode = DataGridViewColumnSortMode.Automatic; + // // groupBox // groupBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; @@ -183,13 +191,6 @@ groupBox.TabStop = false; groupBox.Text = "Услуги:"; // - // ColumnServiceDescription - // - ColumnServiceDescription.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - ColumnServiceDescription.HeaderText = "Услуга"; - ColumnServiceDescription.Name = "ColumnServiceDescription"; - ColumnServiceDescription.Resizable = DataGridViewTriState.True; - // // FormContract // AutoScaleDimensions = new SizeF(7F, 15F); @@ -234,6 +235,6 @@ private Label labelContractPaymentAmount; private DataGridView dataGridViewServices; private GroupBox groupBox; - private DataGridViewTextBoxColumn ColumnServiceDescription; + private DataGridViewComboBoxColumn ColumnServiceDescription; } } \ No newline at end of file diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs index d883750..6271a08 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs @@ -9,7 +9,7 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms private readonly IContractRepository _contractRepository; public FormContract(IContractRepository contractRepository, ICustomerRepository customerRepository, - IExecutorRepository executorRepository) + IExecutorRepository executorRepository, IServiceRepository serviceRepository) { InitializeComponent(); _contractRepository = contractRepository ?? throw new ArgumentNullException(nameof(contractRepository)); diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.cs index 6831fd9..2d41b29 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.cs @@ -41,9 +41,9 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms { if (string.IsNullOrEmpty(richTextBoxServiceDescription.Text)) throw new Exception("Имеются незаполненные поля"); - - _serviceRepository.CreateService(Service.CreateEntity(0, - richTextBoxServiceDescription.Text)); + + if (_serviceId.HasValue) _serviceRepository.UpdateService(Service.CreateEntity(_serviceId.Value, richTextBoxServiceDescription.Text)); + else _serviceRepository.CreateService(Service.CreateEntity(0, richTextBoxServiceDescription.Text)); Close(); } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.resx b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormService.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Program.cs b/PIbd-23_Gutorov_I.A._IT-Company/Program.cs index a253ffa..8114fc4 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Program.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Program.cs @@ -32,6 +32,7 @@ namespace PIbd_23_Gutorov_I.A._IT_Company container.RegisterType(); container.RegisterType(); container.RegisterType(); + container.RegisterType(); container.RegisterType(); diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/IServiceRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/IServiceRepository.cs index aa261c0..99d3a4f 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/IServiceRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/IServiceRepository.cs @@ -8,9 +8,9 @@ public interface IServiceRepository Service ReadServiceById(int id); - void CreateService(Service Service); + void CreateService(Service service); - void UpdateService(Service Service); + void UpdateService(Service service); void DeleteService(int id); } \ No newline at end of file diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs index d909fb3..3b69512 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs @@ -37,11 +37,15 @@ public class ContractRepository : IContractRepository var contractId = connection.QueryFirst(queryInsert, contract, transaction); var querySubInsert = @" - INSERT INTO Services (Description, ContractId) - VALUES (@Description, @ContractId); + INSERT INTO ServiceContract (ServiceId, ContractId) + VALUES (@ServiceId, @ContractId); "; foreach (var elem in contract.Services) - connection.Execute(querySubInsert, new { elem.Description, contractId }, transaction); + { + var serviceId = elem.Id; + connection.Execute(querySubInsert, new { serviceId, contractId }, transaction); + } + transaction.Commit(); } catch (Exception ex) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ServiceRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ServiceRepository.cs index 922a9fc..85718cb 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ServiceRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ServiceRepository.cs @@ -1,28 +1,127 @@ -using PIbd_23_Gutorov_I.A._IT_Company.Entities; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.CodeDom.Compiler; namespace PIbd_23_Gutorov_I.A._IT_Company.Repositories.Implementations; -internal class ServiceRepository : IServiceRepository +public class ServiceRepository : IServiceRepository { - public void CreateService(Service Service) + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public ServiceRepository(IConnectionString connectionString, ILogger logger) { + _connectionString = connectionString; + _logger = logger; + } + + + public void CreateService(Service service) + { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(service)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" + INSERT INTO Services (Description) + VALUES (@Description); + "; + connection.Execute(queryInsert, service); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteService(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Services WHERE Id = @Id; + "; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Service ReadServiceById(int id) { - return Service.CreateEntity(0, string.Empty); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Services WHERE Id = @Id; + "; + var service = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(service)); + return service; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadServices() { - return []; + _logger.LogInformation("Получение всех объектов"); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Services; + "; + var services = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(services)); + return services; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } - public void UpdateService(Service Service) + public void UpdateService(Service service) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(service)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Services + SET Description = @Description + WHERE Id = @Id; + "; + connection.Execute(queryUpdate, service); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } } \ No newline at end of file