From 9763ab2e402afb4059d6aaebddbf435e43af8c27 Mon Sep 17 00:00:00 2001 From: Ivan Gutorov Date: Mon, 9 Dec 2024 04:20:44 +0400 Subject: [PATCH 1/6] add desplay names and set browsable for entities. have not touched other dirs --- .../Entities/Contract.cs | 17 +++++++++++++++++ .../Entities/Customer.cs | 9 ++++++++- .../Entities/CustomerExecutorReview.cs | 14 +++++++++++++- .../Entities/Executor.cs | 5 +++++ .../Entities/Service.cs | 5 ++++- .../Entities/ServiceContract.cs | 12 +++++++++++- 6 files changed, 58 insertions(+), 4 deletions(-) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs index c56b0a1..2566b29 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs @@ -1,4 +1,5 @@ using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; @@ -6,18 +7,34 @@ public class Contract { public int Id { get; private set; } + [Browsable(false)] public int CustomerID { get; private set; } + [Browsable(false)] public int ExecutorID { get; private set; } + [DisplayName("Заказчик")] + public int CustomerName { get; private set; } + + [DisplayName("Исполнитель")] + public int ExecutorName { get; private set; } + + [DisplayName("Тип контракта")] public ContractCategory Category { get; private set; } + [DisplayName("Дата заключения")] public DateTime ConclusionDate { get; private set; } + [DisplayName("Дата окончания")] public DateTime Deadline { get; private set; } + [DisplayName("Сумма платежа")] public int PaymentAmount { get; private set; } + [DisplayName("Услуги")] + public string Service => Services != null ? string.Join(", ", Services) : string.Empty; + + [Browsable(false)] public IEnumerable Services { get; private set; } = []; public static Contract CreateEntity(int id, int customerID, int executorID, diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs index c3f26db..88c721c 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs @@ -1,13 +1,20 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class Customer { public int Id { get; private set; } + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + [DisplayName("Контакты")] public string Contact { get; private set; } = string.Empty; + public string FullName => $"{Name} {Contact}"; + + [DisplayName("Адрес")] public string Address { get; private set; } = string.Empty; public static Customer CreateEntity(int id, string name, string contact, string address) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs index 1a7f114..66f5db1 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs @@ -1,15 +1,27 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class CustomerExecutorReview { public int Id { get; private set; } + [Browsable(false)] public int CustomerId { get; private set; } + [Browsable(false)] public int ExecutorId { get; private set; } + [DisplayName("Заказчик")] + public int CustomerName { get; private set; } + + [DisplayName("Исполнитель")] + public int ExecutorName { get; private set; } + + [DisplayName("Отзыв")] public string Review { get; private set; } = string.Empty; + [DisplayName("Оценка")] public int Grade { get; private set; } public static CustomerExecutorReview CreateElement(int id, int customerId, int executorId, string review, int grade) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs index b80579e..f2f7183 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs @@ -1,4 +1,5 @@ using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; @@ -6,10 +7,14 @@ public class Executor { public int Id { get; private set; } + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + [DisplayName("Должность")] public ExecutorPost Post { get; private set; } + public string FullName => $"{Post} {Name}"; + public static Executor CreateEntity(int id, string name, ExecutorPost post) { return new Executor diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs index 76ee123..cbaa4be 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs @@ -1,9 +1,12 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class Service { public int Id { get; private set; } + [DisplayName("Описание услуги")] public string Description { get; private set; } = string.Empty; public static Service CreateEntity(int id, string description) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs index 7edd1bd..4a4c36d 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs @@ -1,13 +1,23 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class ServiceContract { public int Id { get; private set; } + [Browsable(false)] public int ServiceId { get; private set; } + [Browsable(false)] public int ContractId { get; private set; } + [DisplayName("Заказчик")] + public int CustomerName { get; private set; } + + [DisplayName("Исполнитель")] + public int ExecutorName { get; private set; } + public static ServiceContract CreateElement(int id, int serviceId, int contractId) { return new ServiceContract -- 2.25.1 From a2123b8840b00141681faf116fb38389e6cc7146 Mon Sep 17 00:00:00 2001 From: vasmaae Date: Mon, 9 Dec 2024 00:52:36 -0800 Subject: [PATCH 2/6] fix Service property in Contract entity --- PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs index 2566b29..37a79df 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs @@ -32,7 +32,7 @@ public class Contract public int PaymentAmount { get; private set; } [DisplayName("Услуги")] - public string Service => Services != null ? string.Join(", ", Services) : string.Empty; + public string Service => Services != null ? string.Join(", ", Services.Select(x => $"{x.Description}")) : string.Empty; [Browsable(false)] public IEnumerable Services { get; private set; } = []; -- 2.25.1 From 8ff6da0fe13a7008979cc26608d8abe41fc98035 Mon Sep 17 00:00:00 2001 From: vasmaae Date: Mon, 9 Dec 2024 01:11:04 -0800 Subject: [PATCH 3/6] set fullname instead of id, set not visible id and fullname --- PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs | 4 ++-- .../Forms/FormContractReport.cs | 2 +- PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs | 6 +++++- .../Forms/FormCustomerExecutorReview.cs | 4 ++-- .../Forms/FormCustomerExecutorReviews.cs | 6 +++++- PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs | 7 ++++++- PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs | 7 ++++++- PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs | 6 +++++- 8 files changed, 32 insertions(+), 10 deletions(-) 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 2cf5d43..b44ed73 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs @@ -15,11 +15,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms _contractRepository = contractRepository ?? throw new ArgumentNullException(nameof(contractRepository)); comboBoxContractCustomerId.DataSource = customerRepository.ReadCustomers(); - comboBoxContractCustomerId.DisplayMember = "Name"; + comboBoxContractCustomerId.DisplayMember = "FullName"; comboBoxContractCustomerId.ValueMember = "Id"; comboBoxContractExecutorId.DataSource = executorRepository.ReadExecutors(); - comboBoxContractExecutorId.DisplayMember = "Name"; + comboBoxContractExecutorId.DisplayMember = "FullName"; comboBoxContractExecutorId.ValueMember = "Id"; ColumnServiceDescription.DataSource = serviceRepository.ReadServices(); diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs index c45c1d4..fb99dbe 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs @@ -14,7 +14,7 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms _container = container ?? throw new ArgumentNullException(nameof(container)); comboBoxCutomerId.DataSource = customerRepository.ReadCustomers(); - comboBoxCutomerId.DisplayMember = "Name"; + comboBoxCutomerId.DisplayMember = "FullName"; comboBoxCutomerId.ValueMember = "Id"; } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs index abce63a..8bf9ffe 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs @@ -60,7 +60,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _contractRepository.ReadContracts(); + private void LoadList() + { + dataGridViewData.DataSource = _contractRepository.ReadContracts(); + dataGridViewData.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { 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 a12334a..0b29a67 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs @@ -15,11 +15,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms throw new ArgumentNullException(nameof(customerExecutorReviewRepository)); comboBoxCustomerExecutorReviewCustomerId.DataSource = customerRepository.ReadCustomers(); - comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "Name"; + comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "FullName"; comboBoxCustomerExecutorReviewCustomerId.ValueMember = "Id"; comboBoxCustomerExecutorReviewExecutorId.DataSource = executorRepository.ReadExecutors(); - comboBoxCustomerExecutorReviewExecutorId.DisplayMember = "Name"; + comboBoxCustomerExecutorReviewExecutorId.DisplayMember = "FullName"; comboBoxCustomerExecutorReviewExecutorId.ValueMember = "Id"; } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs index 27d60c1..141ecbb 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs @@ -41,6 +41,10 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _customerExecutorReviewRepository.ReadCustomerExecutorReviews(); + private void LoadList() + { + dataGridViewData.DataSource = _customerExecutorReviewRepository.ReadCustomerExecutorReviews(); + dataGridViewData.Columns["Id"].Visible = false; + } } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs index ebceb67..c72b9ab 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs @@ -78,7 +78,12 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _customerRepository.ReadCustomers(); + private void LoadList() + { + dataGridViewData.DataSource = _customerRepository.ReadCustomers(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs index f4b93ba..361e943 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs @@ -78,7 +78,12 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _executorRepository.ReadExecutors(); + private void LoadList() + { + dataGridViewData.DataSource = _executorRepository.ReadExecutors(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs index 60f8f62..c473165 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs @@ -78,7 +78,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _serviceRepository.ReadServices(); + private void LoadList() + { + dataGridViewData.DataSource = _serviceRepository.ReadServices(); + dataGridViewData.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { -- 2.25.1 From c62dd35f93058a06880db62acbeabbf0ccbb1fb9 Mon Sep 17 00:00:00 2001 From: vasmaae Date: Mon, 9 Dec 2024 02:55:48 -0800 Subject: [PATCH 4/6] add all except ContractRepository logic --- .../Entities/Contract.cs | 14 +++++++- .../Entities/CustomerExecutorReview.cs | 13 +++++-- .../Entities/TempServiceContract.cs | 24 ------------- .../Forms/FormContracts.cs | 2 ++ .../Reports/ChartReport.cs | 5 ++- .../Reports/TableReport.cs | 7 ++-- .../Implementations/ContractRepository.cs | 36 ++++++++++++++----- .../CustomerExecutorReviewRepository.cs | 19 ++++++++-- .../Implementations/QueryBuilder.cs | 33 +++++++++++++++++ 9 files changed, 105 insertions(+), 48 deletions(-) delete mode 100644 PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs create mode 100644 PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs index 37a79df..4d6d45f 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs @@ -16,8 +16,14 @@ public class Contract [DisplayName("Заказчик")] public int CustomerName { get; private set; } + [Browsable(false)] + public ExecutorPost ExecutorPost { get; private set; } + + [Browsable(false)] + public string ExecutorName { get; private set; } = string.Empty; + [DisplayName("Исполнитель")] - public int ExecutorName { get; private set; } + public string ExecutorFullName => $"{ExecutorPost} {ExecutorName}"; [DisplayName("Тип контракта")] public ContractCategory Category { get; private set; } @@ -68,4 +74,10 @@ public class Contract Services = services }; } + + public void SetServices(IEnumerable services) + { + if (services != null && services.Any()) + Services = services; + } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs index 66f5db1..a79735a 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; @@ -13,10 +14,16 @@ public class CustomerExecutorReview public int ExecutorId { get; private set; } [DisplayName("Заказчик")] - public int CustomerName { get; private set; } + public string CustomerName { get; private set; } = string.Empty; + + [Browsable(false)] + public ExecutorPost ExecutorPost { get; private set; } + + [Browsable(false)] + public string ExecutorName { get; private set; } = string.Empty; [DisplayName("Исполнитель")] - public int ExecutorName { get; private set; } + public string ExecutorFullName => $"{ExecutorPost} {ExecutorName}"; [DisplayName("Отзыв")] public string Review { get; private set; } = string.Empty; diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs deleted file mode 100644 index 9509d60..0000000 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs +++ /dev/null @@ -1,24 +0,0 @@ -using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; - -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; - -public class TempServiceContract -{ - public int Id { get; private set; } - - public int CustomerID { get; private set; } - - public int ExecutorID { get; private set; } - - public ContractCategory Category { get; private set; } - - public DateTime ConclusionDate { get; private set; } - - public DateTime Deadline { get; private set; } - - public int PaymentAmount { get; private set; } - - public int ServiceId { get; private set; } - - public string Description { get; private set; } = string.Empty; -} diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs index 8bf9ffe..f1751a3 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs @@ -64,6 +64,8 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms { dataGridViewData.DataSource = _contractRepository.ReadContracts(); dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["ConclusionDate"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; + dataGridViewData.Columns["Deadline"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; } private bool TryGetIdentifierFromSelectedRow(out int id) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs index dff89b8..c3f808b 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs @@ -23,7 +23,7 @@ internal class ChartReport { new PdfBuilder(filePath) .AddHeader("Заключение контрактов") - .AddPieChart("Услуги", GetData(dateTime)) + .AddPieChart($"Оказанные услуги на {dateTime: dd MMMM yyyy}", GetData(dateTime)) .Build(); return true; @@ -38,8 +38,7 @@ internal class ChartReport private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _contractRepository - .ReadContracts() - .Where(x => x.ConclusionDate.Date == dateTime.Date) + .ReadContracts(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) .GroupBy(x => x.CustomerID, (key, group) => new { Id = key, diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs index 85c6d5a..8c288da 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs @@ -26,7 +26,7 @@ internal class TableReport { new ExcelBuilder(filePath) .AddHeader("Сводка по заключениям контрактов", 0, 4) - .AddParagraph("за период", 0) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) .AddTable([10, 10, 15, 15], GetData(customerId, startDate, endDate)) .Build(); @@ -42,10 +42,7 @@ internal class TableReport private List GetData(int customerId, DateTime startDate, DateTime endDate) { var data = _contractRepository - .ReadContracts() - .Where(x => x.ConclusionDate >= startDate - && x.ConclusionDate <= endDate - && x.CustomerID == customerId) + .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) .GroupBy(x => x.ConclusionDate) .Select(x => new { 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 c0123dc..354bd73 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 @@ -83,20 +83,38 @@ public class ContractRepository : IContractRepository try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("c.ConclusionDate >= @dateFrom"); + builder.AddCondition("c.Deadline >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("c.ConclusionDate <= @dateTo"); + builder.AddCondition("c.Deadline <= @dateTo"); + } + if (customerId.HasValue) + builder.AddCondition("c.CustomerId >= @customerId"); + if (executorId.HasValue) + builder.AddCondition("c.ExecutorId >= @executorId"); + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" - SELECT c.*, sc.ServiceId, s.Description + var querySelect = @$" + SELECT c.*, sc.ServiceId, s.Description, + CONCAT(cu.Name, ' ', cu.Contact) as CustomerName, + e.Post as ExecutorPost, + e.Name as ExecutorName FROM Contracts c INNER JOIN ServiceContract sc ON sc.ContractId = c.Id - INNER JOIN Services s ON sc.ServiceId = s.Id + LEFT JOIN Services s ON sc.ServiceId = s.Id + LEFT JOIN Customers cu ON cu.Id = c.CustomerId + LEFT JOIN Executors e ON e.Id = c.ExecutorId + {builder.Build()}; "; - var contracts = connection.Query(querySelect); + var serviceDict = new Dictionary>(); + var contracts = connection.Query(querySelect, new { dateFrom, dateTo, customerId, executorId }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); - return contracts - .GroupBy(x => x.Id, y => y, (key, value) => - Contract.CreateEntity(value.First(), value.Select(z => Service.CreateEntity(z.ServiceId, z.Description)))) - .ToList(); - } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); 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 cefc193..105adbb 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 @@ -66,11 +66,24 @@ public class CustomerExecutorReviewRepository : ICustomerExecutorReviewRepositor try { + var builder = new QueryBuilder(); + if (customerId.HasValue) + builder.AddCondition("cer.CustomerId = @customerId"); + if (executorId.HasValue) + builder.AddCondition("cer.ExecutorId = @executorId"); + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" - SELECT * FROM CustomerExecutorReviews; + var querySelect = @$" + SELECT cer.*, + CONCAT(c.Name, ' ', c.Contact) as CustomerName, + e.Post as ExecutorPost, + e.Name as ExecutorName + FROM CustomerExecutorReviews cer + LEFT JOIN Customers c ON c.Id = cer.CustomerId + LEFT JOIN Executors e ON e.Id = cer.ExecutorId + {builder.Build()}; "; - var customerExecutorReviews = connection.Query(querySelect); + var customerExecutorReviews = connection.Query(querySelect, new { customerId, executorId }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(customerExecutorReviews)); return customerExecutorReviews; } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..6505cdb --- /dev/null +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,33 @@ +using System.Text; + +internal class QueryBuilder +{ + private readonly StringBuilder _builder; + + public QueryBuilder() + { + _builder = new(); + } + + public QueryBuilder AddCondition(string condition) + { + if (_builder.Length > 0) + { + _builder.Append(" AND "); + } + + _builder.Append(condition); + + return this; + } + + public string Build() + { + if (_builder.Length == 0) + { + return string.Empty; + } + + return $"WHERE {_builder}"; + } +} \ No newline at end of file -- 2.25.1 From bce2e9612a84a5bb67809c9b90317f100bf29c49 Mon Sep 17 00:00:00 2001 From: Ivan Gutorov Date: Tue, 24 Dec 2024 15:43:04 +0400 Subject: [PATCH 5/6] final version, reports with names, loading many-to-many entity --- .../Entities/Contract.cs | 17 +-------- .../Entities/ServiceContract.cs | 7 ++-- .../Reports/ChartReport.cs | 2 +- .../Reports/TableReport.cs | 11 +++--- .../Implementations/ContractRepository.cs | 36 ++++++++++++++++--- 5 files changed, 40 insertions(+), 33 deletions(-) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs index 4d6d45f..60c26ae 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs @@ -14,7 +14,7 @@ public class Contract public int ExecutorID { get; private set; } [DisplayName("Заказчик")] - public int CustomerName { get; private set; } + public string CustomerName { get; private set; } = string.Empty; [Browsable(false)] public ExecutorPost ExecutorPost { get; private set; } @@ -60,21 +60,6 @@ public class Contract }; } - public static Contract CreateEntity(TempServiceContract tempServiceContract, IEnumerable services) - { - return new Contract - { - Id = tempServiceContract.Id, - CustomerID = tempServiceContract.CustomerID, - ExecutorID = tempServiceContract.ExecutorID, - Category = tempServiceContract.Category, - ConclusionDate = tempServiceContract.ConclusionDate, - Deadline = tempServiceContract.Deadline, - PaymentAmount = tempServiceContract.PaymentAmount, - Services = services - }; - } - public void SetServices(IEnumerable services) { if (services != null && services.Any()) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs index 4a4c36d..83d9a1f 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs @@ -12,11 +12,8 @@ public class ServiceContract [Browsable(false)] public int ContractId { get; private set; } - [DisplayName("Заказчик")] - public int CustomerName { get; private set; } - - [DisplayName("Исполнитель")] - public int ExecutorName { get; private set; } + [DisplayName("Описание услуги")] + public string ServiceDescription { get; private set; } = string.Empty; public static ServiceContract CreateElement(int id, int serviceId, int contractId) { diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs index c3f808b..d350597 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs @@ -39,7 +39,7 @@ internal class ChartReport { return _contractRepository .ReadContracts(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) - .GroupBy(x => x.CustomerID, (key, group) => new + .GroupBy(x => x.CustomerName, (key, group) => new { Id = key, Count = group.Sum(x => x.Services.Count()) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs index 8c288da..2217019 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs @@ -46,21 +46,18 @@ internal class TableReport .GroupBy(x => x.ConclusionDate) .Select(x => new { - x.First().ExecutorID, + x.First().ExecutorFullName, Date = x.First().ConclusionDate, CountIn = (int?)x.Count(), CountOut = (int?)null }) .Union( _contractRepository - .ReadContracts() - .Where(x => x.Deadline >= startDate - && x.Deadline <= endDate - && x.CustomerID == customerId) + .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) .GroupBy(x => x.Deadline) .Select(x => new { - x.First().ExecutorID, + x.First().ExecutorFullName, Date = x.First().Deadline, CountIn = (int?)null, CountOut = (int?)x.Count() @@ -71,7 +68,7 @@ internal class TableReport return new List() { item } .Union(data.Select(x => new string[] { - x.ExecutorID.ToString(), + x.ExecutorFullName, x.Date.ToString(), x.CountIn?.ToString() ?? string.Empty, x.CountOut?.ToString() ?? string.Empty 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 354bd73..dc34316 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 @@ -101,10 +101,12 @@ public class ContractRepository : IContractRepository using var connection = new NpgsqlConnection(_connectionString.ConnectionString); var querySelect = @$" - SELECT c.*, sc.ServiceId, s.Description, + SELECT c.*, CONCAT(cu.Name, ' ', cu.Contact) as CustomerName, e.Post as ExecutorPost, - e.Name as ExecutorName + e.Name as ExecutorName, + sc.ServiceId, + s.Description as ServiceDescription FROM Contracts c INNER JOIN ServiceContract sc ON sc.ContractId = c.Id LEFT JOIN Services s ON sc.ServiceId = s.Id @@ -112,9 +114,35 @@ public class ContractRepository : IContractRepository LEFT JOIN Executors e ON e.Id = c.ExecutorId {builder.Build()}; "; - var serviceDict = new Dictionary>(); - var contracts = connection.Query(querySelect, new { dateFrom, dateTo, customerId, executorId }); + + var contractsDict = new Dictionary>(); + + var contracts = connection.Query(querySelect, (contract, serviceContract) => + { + if (!contractsDict.TryGetValue(contract.Id, out var sc)) + { + sc = []; + contractsDict.Add(contract.Id, sc); + } + + sc.Add(serviceContract); + return contract; + }, splitOn: "ServiceId", param: new + { + dateFrom, + dateTo, + customerId, + executorId + }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); + + return contractsDict.Select(x => + { + var c = contracts.First(y => y.Id == x.Key); + c.SetServices(x.Value.Select(x => Service.CreateEntity(x.ServiceId, x.ServiceDescription))); + return c; + }).ToArray(); + } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); -- 2.25.1 From 2edfb98b6a246e085d214355629d060f94f2fcf1 Mon Sep 17 00:00:00 2001 From: vasmaae Date: Tue, 24 Dec 2024 14:16:39 -0800 Subject: [PATCH 6/6] fix excel report with sum --- .../Reports/TableReport.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs index 2217019..7ec93e3 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs @@ -43,7 +43,7 @@ internal class TableReport { var data = _contractRepository .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) - .GroupBy(x => x.ConclusionDate) + .GroupBy(x => x.ExecutorFullName) .Select(x => new { x.First().ExecutorFullName, @@ -54,7 +54,7 @@ internal class TableReport .Union( _contractRepository .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) - .GroupBy(x => x.Deadline) + .GroupBy(x => x.ExecutorFullName) .Select(x => new { x.First().ExecutorFullName, @@ -69,12 +69,12 @@ internal class TableReport return new List() { item } .Union(data.Select(x => new string[] { x.ExecutorFullName, - x.Date.ToString(), - x.CountIn?.ToString() ?? string.Empty, - x.CountOut?.ToString() ?? string.Empty + x.Date.ToString("dd.MM.yyyy"), + x.CountIn?.ToString("N0") ?? string.Empty, + x.CountOut?.ToString("N0") ?? string.Empty })) .Union( - [["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString(), data.Sum(x => x.CountOut ?? 0).ToString()]]) + [["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString("N0"), data.Sum(x => x.CountOut ?? 0).ToString("N0")]]) .ToList(); } } -- 2.25.1