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 b2ceea6..a8edfe6 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs @@ -16,11 +16,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms comboBoxContractCustomerId.DataSource = customerRepository.ReadCustomers(); comboBoxContractCustomerId.DisplayMember = "Name"; - comboBoxContractCustomerId.DisplayMember = "Id"; + comboBoxContractCustomerId.ValueMember = "Id"; comboBoxContractExecutorId.DataSource = executorRepository.ReadExecutors(); comboBoxContractExecutorId.DisplayMember = "Name"; - comboBoxContractExecutorId.DisplayMember = "Id"; + comboBoxContractExecutorId.ValueMember = "Id"; foreach (var elem in Enum.GetValues(typeof(ContractCategory))) { @@ -71,10 +71,9 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms foreach (DataGridViewRow row in dataGridViewServices.Rows) if (!row.IsNewRow) - list.Add(Service.CreateEntity(0, Convert.ToString(row.Cells["Description"].Value)!, 0)); + list.Add(Service.CreateEntity(0, Convert.ToString(row.Cells["ColumnServiceDescription"].Value)!, 0)); return list; } - } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs index dcf0cef..ba849c6 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs @@ -11,15 +11,16 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms ICustomerRepository customerRepository, IExecutorRepository executorRepository) { InitializeComponent(); - _customerExecutorReviewRepository = customerExecutorReviewRepository ?? throw new ArgumentNullException(nameof(customerExecutorReviewRepository)); + _customerExecutorReviewRepository = customerExecutorReviewRepository ?? + throw new ArgumentNullException(nameof(customerExecutorReviewRepository)); comboBoxCustomerExecutorReviewCustomerId.DataSource = customerRepository.ReadCustomers(); comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "Name"; - comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "Id"; + comboBoxCustomerExecutorReviewCustomerId.ValueMember = "Id"; comboBoxCustomerExecutorReviewExecutorId.DataSource = executorRepository.ReadExecutors(); comboBoxCustomerExecutorReviewExecutorId.DisplayMember = "Name"; - comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "Id"; + comboBoxCustomerExecutorReviewCustomerId.ValueMember = "Id"; } private void ButtonSave_Click(object sender, EventArgs e) @@ -33,9 +34,7 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms throw new Exception("Имеются незаполненные поля"); } - _customerExecutorReviewRepository.CreateCustomerExecutorReview(CustomerExecutorReview.CreateElement( - 0, (int)comboBoxCustomerExecutorReviewCustomerId.SelectedValue!, (int)comboBoxCustomerExecutorReviewExecutorId.SelectedValue!, - richTextBoxCustomerExecutorReviewReview.Text, Convert.ToInt32(numericUpDownCustomerExecutorReviewGrade.Value))); + _customerExecutorReviewRepository.CreateCustomerExecutorReview(CreateCustomerExecutorReview(0)); Close(); } @@ -46,5 +45,14 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private CustomerExecutorReview CreateCustomerExecutorReview(int id) + { + return CustomerExecutorReview.CreateElement( + id, (int)comboBoxCustomerExecutorReviewCustomerId.SelectedValue!, + (int)comboBoxCustomerExecutorReviewExecutorId.SelectedValue!, + richTextBoxCustomerExecutorReviewReview.Text, + Convert.ToInt32(numericUpDownCustomerExecutorReviewGrade.Value)); + } } } 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 e1c6667..d909fb3 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 @@ -2,14 +2,12 @@ using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; -using System.Data.SqlClient; namespace PIbd_23_Gutorov_I.A._IT_Company.Repositories.Implementations; public class ContractRepository : IContractRepository { private readonly IConnectionString _connectionString; - private readonly ILogger _logger; public ContractRepository(IConnectionString connectionString, ILogger logger) @@ -27,10 +25,24 @@ public class ContractRepository : IContractRepository { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); connection.Open(); + using var transaction = connection.BeginTransaction(); + var queryInsert = @" - INSERT INTO Contracts (CustomerId, ExecutorId, Category, ConclusionDate, Deadline, PaymentAmount) - VALUES (@CustomerId, @ExecutorId, @Category, @ConclusionDate, @Deadline, @PaymentAmount)"; - connection.Execute(queryInsert, contract); + INSERT INTO Contracts (CustomerId, ExecutorId, Category, + ConclusionDate, Deadline, PaymentAmount) + VALUES (@CustomerId, @ExecutorId, @Category, + @ConclusionDate, @Deadline, @PaymentAmount); + SELECT MAX(Id) FROM Contracts; + "; + var contractId = connection.QueryFirst(queryInsert, contract, transaction); + + var querySubInsert = @" + INSERT INTO Services (Description, ContractId) + VALUES (@Description, @ContractId); + "; + foreach (var elem in contract.Services) + connection.Execute(querySubInsert, new { elem.Description, contractId }, transaction); + transaction.Commit(); } catch (Exception ex) { @@ -41,16 +53,16 @@ public class ContractRepository : IContractRepository public void DeleteContract(int id) { - _logger.LogInformation("Добавление объекта"); + _logger.LogInformation("Удаление объекта"); _logger.LogDebug("Объект: {id}", id); try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - connection.Open(); var queryDelete = @" DELETE FROM Contracts - WHERE Id = @id"; + WHERE Id = @id + "; connection.Execute(queryDelete, new { id }); } catch (Exception ex) @@ -67,7 +79,6 @@ public class ContractRepository : IContractRepository try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - connection.Open(); var querySelect = @"SELECT * FROM Contracts"; var contracts = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs index 24d341a..cefc193 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs @@ -1,4 +1,7 @@ -using Microsoft.Extensions.Logging; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; using PIbd_23_Gutorov_I.A._IT_Company.Entities; namespace PIbd_23_Gutorov_I.A._IT_Company.Repositories.Implementations; @@ -8,17 +11,73 @@ public class CustomerExecutorReviewRepository : ICustomerExecutorReviewRepositor private readonly IConnectionString _connectionString; private readonly ILogger _logger; + public CustomerExecutorReviewRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateCustomerExecutorReview(CustomerExecutorReview customerContractReview) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(customerContractReview)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" + INSERT INTO CustomerExecutorReviews (CustomerId, ExecutorId, Review, Grade) + VALUES (@CustomerId, @ExecutorId, @Review, @Grade); + "; + connection.Execute(queryInsert, customerContractReview); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public CustomerExecutorReview ReadCustomerExecutorReviewById(int id) { - return CustomerExecutorReview.CreateElement(0, 0, 0, string.Empty, 0); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM CustomerExecutorReviews WHERE Id = @Id; + "; + var customerEexcutorReview = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(customerEexcutorReview)); + return customerEexcutorReview; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadCustomerExecutorReviews(int? customerId = null, int? executorId = null) { - return []; + _logger.LogInformation("Получение всех объектов"); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM CustomerExecutorReviews; + "; + var customerExecutorReviews = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(customerExecutorReviews)); + return customerExecutorReviews; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ExecutorRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ExecutorRepository.cs index e1130a8..d4b663b 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ExecutorRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ExecutorRepository.cs @@ -1,4 +1,7 @@ -using Microsoft.Extensions.Logging; +using Dapper; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; using PIbd_23_Gutorov_I.A._IT_Company.Entities; namespace PIbd_23_Gutorov_I.A._IT_Company.Repositories.Implementations; @@ -8,25 +11,115 @@ public class ExecutorRepository : IExecutorRepository private readonly IConnectionString _connectionString; private readonly ILogger _logger; + public ExecutorRepository(IConnectionString connectionString, ILogger logger) + { + _connectionString = connectionString; + _logger = logger; + } + public void CreateExecutor(Executor executor) { + _logger.LogInformation("Добавление объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(executor)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryInsert = @" + INSERT INTO Executors (Name, Post) + VALUES (@Name, @Post); + "; + connection.Execute(queryInsert, executor); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при добавлении объекта"); + throw; + } } public void DeleteExecutor(int id) { + _logger.LogInformation("Удаление объекта"); + _logger.LogDebug("Объект: {id}", id); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryDelete = @" + DELETE FROM Executors WHERE Id = @Id; + "; + connection.Execute(queryDelete, new { id }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при удалении объекта"); + throw; + } } public Executor ReadExecutorById(int id) { - return Executor.CreateEntity(0, string.Empty, Entities.Enums.ExecutorPost.None); + _logger.LogInformation("Получение объекта по идентификатору"); + _logger.LogDebug("Объект: {id}", id); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Executors WHERE Id = @Id; + "; + var executor = connection.QueryFirst(querySelect, new { id }); + _logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(executor)); + return executor; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } } public IEnumerable ReadExecutors() { - return []; + _logger.LogInformation("Получение всех объектов"); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @" + SELECT * FROM Executors; + "; + var executors = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(executors)); + return executors; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } } public void UpdateExecutor(Executor executor) { + _logger.LogInformation("Редактирование объекта"); + _logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(executor)); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var queryUpdate = @" + UPDATE Executors + SET Name = @Name, Post = @Post + WHERE Id = @Id; + "; + connection.Execute(queryUpdate, executor); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при редактировании объекта"); + throw; + } } }