diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Client.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Client.cs index 4473053..7809372 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Client.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Client.cs @@ -1,6 +1,7 @@ using ProjectCompanyFurniture.Entities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,10 +12,13 @@ public class Client { public int ID { get; private set; } + [DisplayName("ФИО клиента")] public string Name { get; private set; } + [DisplayName("Тип клиента")] public ClientType ClientType { get; private set; } + [DisplayName("Оптовик")] public bool Optovik { get; private set; } public static Client CreateEntity(int id, string name, ClientType clientType, bool optovik) diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Invoice.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Invoice.cs index 736c3dd..e7f0011 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Invoice.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Invoice.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,23 +11,36 @@ public class Invoice { public int ID { get; private set; } + [Browsable(false)] public int ClientID { get; set; } + [DisplayName("Клиент")] + public string ClientName { get; set; } + // 0 или 1 + [DisplayName("Наличие промокода")] public int AvailabilityOfPromotionalCode { get; set; } + [DisplayName("Процент скидки")] public int DiscountPercentage { get; set; } + [DisplayName("Отпускная цена")] public int SellingPrice { get; set; } + [DisplayName("Дата")] public DateTime DateInvoice { get; set; } + [Browsable(false)] public IEnumerable Products { get; private set; } = []; + [DisplayName("Продукты")] + public string Product => Products != null ? + string.Join(", ", Products.Select(x => $"{x.ProductName} {x.Count}")) : string.Empty; + public static Invoice CreateOperation(int id, int clientId, int availabilityOfPromotionalCode, int discountPercentage, int sellingPrice, IEnumerable products) { @@ -42,17 +56,11 @@ public class Invoice }; } - public static Invoice CreateOperation(TempInvoiceProduct tempInvoiceProduct, IEnumerable products) + public void SetInvoiceProducts(IEnumerable products) { - return new Invoice + if (products != null && products.Any()) { - ID = tempInvoiceProduct.ID, - ClientID = tempInvoiceProduct.ClientID, - AvailabilityOfPromotionalCode = tempInvoiceProduct.AvailabilityOfPromotionalCode, - DiscountPercentage = tempInvoiceProduct.DiscountPercentage, - SellingPrice = tempInvoiceProduct.SellingPrice, - DateInvoice = tempInvoiceProduct.DateInvoice, - Products = products - }; + Products = products; + } } } diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/InvoiceProduct.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/InvoiceProduct.cs index 5af3e74..b3a449b 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/InvoiceProduct.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/InvoiceProduct.cs @@ -11,6 +11,8 @@ public class InvoiceProduct public int InvoiceID { get; private set; } public int ProductID { get; private set; } + + public string ProductName { get; private set; } = string.Empty; public int Count { get; private set; } diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Manufacturer.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Manufacturer.cs index 70716d3..387d5aa 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Manufacturer.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Manufacturer.cs @@ -1,5 +1,6 @@  using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,6 +11,7 @@ public class Manufacturer { public int ID { get; set; } + [DisplayName("Название фирмы")] public string Name { get; set; } public static Manufacturer CreateEntity(int iD, string name) diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Product.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Product.cs index 02fa9de..d011067 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Product.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/Product.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,12 +11,21 @@ public class Product { public int ID { get; private set; } + [Browsable(false)] public int ManufacturerID { get; private set; } + [DisplayName("Фирма")] + public string ManufacturerName { get; private set; } + + [DisplayName("Название товара")] public string Name { get; private set; } + [DisplayName("Производитель")] public string Category { get; private set; } + public string FullName => $"{Category} {Name}"; + + [DisplayName("Начальная цена")] public int StartingPrice { get; private set; } public static Product CreateEntity(int id, int manufacturerID, string name, string category, int startingPrice) diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/ProductMovement.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/ProductMovement.cs index 3ae4b9b..05fc5e9 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/ProductMovement.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/ProductMovement.cs @@ -1,6 +1,7 @@ using ProjectCompanyFurniture.Entities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,12 +12,20 @@ public class ProductMovement { public int ID { get; private set; } + [Browsable(false)] public int ProductID { get; private set; } + [DisplayName("Товар")] + public string ProductName { get; private set; } + + [DisplayName("Тип движения товара")] public Movement MovementType { get; private set; } public int Count { get; private set; } + [DisplayName("Количество")] + public int Count { get; private set; } + [DisplayName("Дата")] public DateTime Date { get; private set; } public static ProductMovement CreateOperation (int it, int productId, int count, Movement movementType) diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/TempInvoiceProduct.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/TempInvoiceProduct.cs deleted file mode 100644 index 35332db..0000000 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Entities/TempInvoiceProduct.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectCompanyFurniture.Entities; - -public class TempInvoiceProduct -{ - public int ID { get; private set; } - - public int ClientID { get; private set; } - - public int AvailabilityOfPromotionalCode { get; private set; } - - public int DiscountPercentage { get; private set; } - - public int SellingPrice { get; private set; } - - public DateTime DateInvoice { get; private set; } - - public int ProductID { get; private set; } - - public int Count { get; private set; } -} diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormClients.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormClients.cs index 40f9fac..ca1556b 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormClients.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormClients.cs @@ -91,7 +91,11 @@ namespace ProjectCompanyFurniture.Forms } - private void LoadList() => dataGridViewData.DataSource = _clientRepository.ReadClients(); + private void LoadList() + { + dataGridViewData.DataSource = _clientRepository.ReadClients(); + dataGridViewData.Columns["ID"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoice.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoice.cs index 6599001..dee9c8c 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoice.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoice.cs @@ -28,7 +28,7 @@ namespace ProjectCompanyFurniture.Forms comboBoxClient.ValueMember = "ID"; ColumnProduct.DataSource = productRepository.ReadProducts(); - ColumnProduct.DisplayMember = "Name"; + ColumnProduct.DisplayMember = "FullName"; ColumnProduct.ValueMember = "ID"; } diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoices.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoices.cs index b5541c6..bc9e991 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoices.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormInvoices.cs @@ -70,7 +70,11 @@ namespace ProjectCompanyFurniture.Forms } } - private void LoadList() => dataGridViewData.DataSource = _invoiceRepository.ReadInvoices(); + private void LoadList() + { + dataGridViewData.DataSource = _invoiceRepository.ReadInvoices(); + dataGridViewData.Columns["ID"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormManufacturers.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormManufacturers.cs index 416178a..126fa9b 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormManufacturers.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormManufacturers.cs @@ -80,7 +80,12 @@ namespace ProjectCompanyFurniture.Forms } } - private void LoadList() => dataGridViewData.DataSource = _manufacturerRepository.ReadManufacturers(); + private void LoadList() + { + dataGridViewData.DataSource = _manufacturerRepository.ReadManufacturers(); + dataGridViewData.Columns["ID"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProductMovements.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProductMovements.cs index 9a47ebe..1c43180 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProductMovements.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProductMovements.cs @@ -50,7 +50,12 @@ namespace ProjectCompanyFurniture.Forms } } - private void LoadList() => dataGridViewData.DataSource = _productMovementRepository.ReadProductMovements(); + private void LoadList() + { + dataGridViewData.DataSource = _productMovementRepository.ReadProductMovements(); + dataGridViewData.Columns["ID"].Visible = false; + dataGridViewData.Columns["Date"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; + } } } diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProducts.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProducts.cs index b20d13e..0633ffc 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProducts.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Forms/FormProducts.cs @@ -91,7 +91,13 @@ namespace ProjectCompanyFurniture.Forms } } - private void LoadList() => dataGridViewData.DataSource = _productRepository.ReadProducts(); + private void LoadList() + { + dataGridViewData.DataSource = _productRepository.ReadProducts(); + dataGridViewData.Columns["ID"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/ChartReport.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/ChartReport.cs index 90b989e..13485d3 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/ChartReport.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/ChartReport.cs @@ -24,7 +24,7 @@ public class ChartReport { new PdfBuilder(filePath) .AddHeader("Сумма покупки каждого клиента") - .AddPieChart("Клиенты", GetData(dateTime)) + .AddPieChart($"Клиенты, сделавшие покупку на {dateTime: dd MMMM yyyy}", GetData(dateTime)) .Build(); return true; } @@ -38,10 +38,10 @@ public class ChartReport private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _invoiceRepository - .ReadInvoices() + .ReadInvoices(dateForm: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) .Where(x => x.DateInvoice.Date == dateTime.Date) - .GroupBy(x => x.ClientID, (key, group) => new { ID = key, Count = group.Sum(y => y.SellingPrice)}) - .Select(x => (x.ID.ToString(), (double)x.Count)) + .GroupBy(x => x.ClientName, (key, group) => new { ClientName = key, Count = group.Sum(y => y.SellingPrice)}) + .Select(x => (x.ClientName, (double)x.Count)) .ToList(); } } diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/TableReport.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/TableReport.cs index 0a6a57f..ccf1a66 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/TableReport.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Reports/TableReport.cs @@ -31,7 +31,7 @@ public class TableReport { new ExcelBuilder(filePath) .AddHeader("Сводка по движению товара", 0, 4) - .AddParagraph("за период", 0) + .AddParagraph($"За период c {startDate:dd.MM.yyyy} по { endDate: dd.MM.yyyy}", 0) .AddTable([10, 10, 15, 15], GetData(productID, startDate, endDate)) .Build(); return true; @@ -45,22 +45,23 @@ public class TableReport private List GetData(int productID, DateTime startDate, DateTime endDate) { + var erte = _invoiceRepository + .ReadInvoices(startDate, endDate, productID); var data = _invoiceRepository - .ReadInvoices() - .Where(x => x.DateInvoice >= startDate && x.DateInvoice <= endDate && x.Products.Any(y => y.ProductID == productID)) - .Select(x => new {x.Products.First(y => y.ProductID == productID).ProductID, Date = x.DateInvoice, CountIn = (int?)null, CountOut =(int?) x.Products.FirstOrDefault(y => y.ProductID == productID)?.Count }) + .ReadInvoices(startDate, endDate, productID) + .Select(x => new {x.Products.FirstOrDefault(y => y.ProductID == productID)?.ProductName, Date = x.DateInvoice, CountIn = (int?)null, CountOut =(int?) x.Products.FirstOrDefault(y => y.ProductID == productID)?.Count }) .Union( _productMovementRepository - .ReadProductMovements() + .ReadProductMovements(startDate, endDate, productID) .Where(x => x.Date >= startDate && x.Date <= endDate && x.ProductID == productID && x.MovementType == Movement.Reseipt) - .Select(x => new {x.ProductID, x.Date, CountIn = (int?)x.Count, CountOut = (int?)null })) + .Select(x => new {x?.ProductName, x.Date, CountIn = (int?)x.Count, CountOut = (int?)null })) .OrderBy(x => x.Date); return new List() { item } .Union( data - .Select(x => new string[] {x.ProductID.ToString(), x.Date.ToString(), x.CountIn?.ToString() ?? string.Empty, x.CountOut?.ToString() ?? string.Empty})) - .Union([["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString(), data.Sum(x => x.CountOut ?? 0).ToString()]]) + .Select(x => new string[] {x.ProductName, x.Date.ToString("dd.MM.yyyy"), x.CountIn?.ToString("N0") ?? string.Empty, x.CountOut?.ToString() ?? string.Empty})) + .Union([["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString(), data.Sum(x => x.CountOut ?? 0).ToString("N0")]]) .ToList(); } diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/InvoiceRepository.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/InvoiceRepository.cs index c2f6b2f..a87c05b 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/InvoiceRepository.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/InvoiceRepository.cs @@ -81,14 +81,44 @@ public class InvoiceRepository : IInvoiceRepository _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateForm.HasValue) + { + builder.AddCondition("inv.DateInvoice >= @dateForm"); + } + if (dateTo.HasValue) + { + builder.AddCondition("inv.DateInvoice <= @dateTo"); + } + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT inv.*, ipr.ProductID, ipr.Count FROM Invoices inv - INNER JOIN InvoiceProducts ipr ON ipr.InvoiceID = inv.ID"; - var invoices = connection.Query(querySelect); + var querySelect = @$"SELECT inv.*, cl.Name as ClientName, ipr.ProductID, ipr.Count, pr.Name as ProductName + FROM Invoices inv + INNER JOIN InvoiceProducts ipr ON ipr.InvoiceID = inv.ID{((productID is null) ? "" : " AND ipr.ProductID = @productID")} + INNER JOIN Clients cl ON inv.ClientID = cl.ID + INNER JOIN Products pr ON pr.ID = ipr.ProductID + {builder.Build()}"; + var productDict = new Dictionary>(); + var invoices = connection.Query(querySelect, + (invoice, invoiceProducts) => + { + if (!productDict.TryGetValue(invoice.ID, out var pr)) + { + pr = []; + productDict.Add(invoice.ID, pr); + } + pr.Add(invoiceProducts); + return invoice; + }, splitOn: "ProductID", param: new {dateForm, dateTo, productID}); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(invoices)); - return invoices.GroupBy(x => x.ID, y => y, - (key, value) => Invoice.CreateOperation(value.First(), - value.Select(z => InvoiceProduct.CreateElement(0, z.ProductID, z.Count)))).ToList(); + + return productDict.Select(x => + { + var pr = invoices.First(y => y.ID == x.Key); + pr.SetInvoiceProducts(x.Value); + return pr; + }).ToArray(); } catch (Exception ex) diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductMovementRepository.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductMovementRepository.cs index 8d7de9c..c68b1ba 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductMovementRepository.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductMovementRepository.cs @@ -47,9 +47,28 @@ public class ProductMovementRepository : IProductMovementRepository _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateForm.HasValue) + { + builder.AddCondition("pm.Date >= @dateForm"); + } + if (dateTo.HasValue) + { + builder.AddCondition("pm.Date <= @dateTo"); + } + if (productID.HasValue) + { + builder.AddCondition("pm.ProductID = @productID"); + } + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM ProductMovements"; - var productMovements = connection.Query(querySelect); + var querySelect = @$"SELECT pm.*, pr.Name as ProductName + FROM ProductMovements pm + INNER JOIN Products pr ON pm.ProductID = pr.ID + {builder.Build()}"; + + + var productMovements = connection.Query(querySelect, new {dateForm, dateTo, productID}); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(productMovements)); return productMovements; diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductRepository.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductRepository.cs index 4fb55cc..514a6d4 100644 --- a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductRepository.cs +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/ProductRepository.cs @@ -110,7 +110,9 @@ public class ProductRepository : IProductRepository try { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM Products"; + var querySelect = @"SELECT pr.*, man.Name as ManufacturerName + FROM Products pr + INNER JOIN Manufacturers man ON pr.ManufacturerID = man.ID"; var products = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(products)); diff --git a/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/QueryBuilder.cs b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..d0c9e44 --- /dev/null +++ b/ProjectCompanyFurniture/ProjectCompanyFurniture/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCompanyFurniture.Repositories.Implementations; + +public 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}"; + } +}