From 15edafea603efca0111a9ba7131c0b393a36a71e Mon Sep 17 00:00:00 2001 From: I1nur Date: Tue, 24 Dec 2024 03:37:47 +0400 Subject: [PATCH] almost done --- .../FamilyBudget/Entities/ExpenseBudget.cs | 6 +- .../Entities/FamilyMember_ExpenseBudget.cs | 4 +- .../FamilyBudget/Entities/IncomeBudget.cs | 6 +- .../FamilyBudget/Forms/FormFamilies.cs | 6 +- .../Forms/FormFamilyMember_ExpenseBudgets.cs | 2 +- .../Forms/FormFamilyMember_IncomeBudgets.cs | 2 +- .../FamilyBudget/Forms/FormFamilyMembers.cs | 8 ++- .../FamilyBudget/Reports/ChartReport.cs | 2 +- .../FamilyBudget/Reports/TableReport.cs | 25 +++---- .../ExpenseBudgetRepository.cs | 68 ++++++++++++++++--- .../Implementations/IncomeBudgetRepository.cs | 66 ++++++++++-------- 11 files changed, 128 insertions(+), 67 deletions(-) diff --git a/FamilyBudget/FamilyBudget/Entities/ExpenseBudget.cs b/FamilyBudget/FamilyBudget/Entities/ExpenseBudget.cs index 24fa9f0..6ab645d 100644 --- a/FamilyBudget/FamilyBudget/Entities/ExpenseBudget.cs +++ b/FamilyBudget/FamilyBudget/Entities/ExpenseBudget.cs @@ -12,8 +12,8 @@ namespace FamilyBudget.Entities public int Id { get; private set; } [Browsable(false)] public int FamilyMemberId { get; private set; } - [DisplayName("Семья")] - public string Name { get; private set; } = string.Empty; + [DisplayName("Участник")] + public string FullName { get; private set; } = string.Empty; [DisplayName("Дата")] public DateTime Date { get; private set; } public string Expenses => FamilyMember_Expenses != null ? @@ -32,7 +32,7 @@ namespace FamilyBudget.Entities }; } - public void setExpenseBudget(IEnumerable familyMember_Expenses) + public void SetExpenseBudget(IEnumerable familyMember_Expenses) { if (familyMember_Expenses != null && familyMember_Expenses.Any()) { diff --git a/FamilyBudget/FamilyBudget/Entities/FamilyMember_ExpenseBudget.cs b/FamilyBudget/FamilyBudget/Entities/FamilyMember_ExpenseBudget.cs index 8645259..ecd7433 100644 --- a/FamilyBudget/FamilyBudget/Entities/FamilyMember_ExpenseBudget.cs +++ b/FamilyBudget/FamilyBudget/Entities/FamilyMember_ExpenseBudget.cs @@ -10,7 +10,7 @@ namespace FamilyBudget.Entities { public int Id { get; private set; } public int ExpenseBudgetId { get; private set; } - public int ExpenseCategoryID { get; private set; } + public int ExpenseBudgetCategoryID { get; private set; } public int Sum { get; private set; } public string ExpenseName { get; private set; } = string.Empty; public static FamilyMember_ExpenseBudget CreateElement(int id, int expenseCategoryID, int expenseBudgetId, int sum) @@ -18,7 +18,7 @@ namespace FamilyBudget.Entities return new FamilyMember_ExpenseBudget() { Id = id, - ExpenseCategoryID = expenseCategoryID, + ExpenseBudgetCategoryID = expenseCategoryID, ExpenseBudgetId = expenseBudgetId, Sum = sum }; diff --git a/FamilyBudget/FamilyBudget/Entities/IncomeBudget.cs b/FamilyBudget/FamilyBudget/Entities/IncomeBudget.cs index 8b8c6a3..f315f4e 100644 --- a/FamilyBudget/FamilyBudget/Entities/IncomeBudget.cs +++ b/FamilyBudget/FamilyBudget/Entities/IncomeBudget.cs @@ -12,8 +12,8 @@ namespace FamilyBudget.Entities public int Id { get; private set; } [Browsable(false)] public int FamilyMemberId { get; private set; } - [DisplayName("Семья")] - public string FamilyName { get; private set; } = string.Empty; + [DisplayName("Участник")] + public string FullName { get; private set; } = string.Empty; [DisplayName("Дата")] public DateTime Date { get; private set; } [DisplayName("Доходы")] @@ -33,7 +33,7 @@ namespace FamilyBudget.Entities }; } - public void setIncomeBudget(IEnumerable familyMember_Incomes) + public void SetIncomeBudget(IEnumerable familyMember_Incomes) { if (familyMember_Incomes != null && familyMember_Incomes.Any()) { diff --git a/FamilyBudget/FamilyBudget/Forms/FormFamilies.cs b/FamilyBudget/FamilyBudget/Forms/FormFamilies.cs index e64bea4..ff5e3ef 100644 --- a/FamilyBudget/FamilyBudget/Forms/FormFamilies.cs +++ b/FamilyBudget/FamilyBudget/Forms/FormFamilies.cs @@ -91,7 +91,11 @@ namespace FamilyBudget.Forms } } - private void LoadList() => dataGridViewFamilies.DataSource = _familyRepository.ReadFamilies(); + private void LoadList() + { + dataGridViewFamilies.DataSource = _familyRepository.ReadFamilies(); + dataGridViewFamilies.Columns["id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_ExpenseBudgets.cs b/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_ExpenseBudgets.cs index 8e76d83..a6911c8 100644 --- a/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_ExpenseBudgets.cs +++ b/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_ExpenseBudgets.cs @@ -76,7 +76,7 @@ namespace FamilyBudget.Forms { dataGridViewExpenses.DataSource = _expenseBudgetRepository.ReadExpenseBudgets(); dataGridViewExpenses.Columns["id"].Visible = false; - dataGridViewExpenses.Columns["data"].DefaultCellStyle.Format = "dd MMMM yyyy"; + dataGridViewExpenses.Columns["date"].DefaultCellStyle.Format = "dd MMMM yyyy"; } private bool TryGetIdentifierFromSelectedRow(out int id) diff --git a/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_IncomeBudgets.cs b/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_IncomeBudgets.cs index 5c1e07c..ceb9c48 100644 --- a/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_IncomeBudgets.cs +++ b/FamilyBudget/FamilyBudget/Forms/FormFamilyMember_IncomeBudgets.cs @@ -63,7 +63,7 @@ namespace FamilyBudget.Forms { dataGridViewIncomes.DataSource = _incomeBudgetRepository.ReadIncomeBudgets(); dataGridViewIncomes.Columns["id"].Visible = false; - dataGridViewIncomes.Columns["data"].DefaultCellStyle.Format = "dd MMMM yyyy"; + dataGridViewIncomes.Columns["date"].DefaultCellStyle.Format = "dd MMMM yyyy"; } private bool TryGetIdentifierFromSelectedRow(out int id) diff --git a/FamilyBudget/FamilyBudget/Forms/FormFamilyMembers.cs b/FamilyBudget/FamilyBudget/Forms/FormFamilyMembers.cs index 959f15b..bc9cb86 100644 --- a/FamilyBudget/FamilyBudget/Forms/FormFamilyMembers.cs +++ b/FamilyBudget/FamilyBudget/Forms/FormFamilyMembers.cs @@ -91,8 +91,12 @@ namespace FamilyBudget.Forms } } - private void LoadList() => dataGridViewFamilyMembers.DataSource = _familyMemberRepository.ReadFamilyMembers(); - + private void LoadList() + { + dataGridViewFamilyMembers.DataSource = _familyMemberRepository.ReadFamilyMembers(); + dataGridViewFamilyMembers.Columns["id"].Visible = false; + dataGridViewFamilyMembers.Columns["FullName"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/FamilyBudget/FamilyBudget/Reports/ChartReport.cs b/FamilyBudget/FamilyBudget/Reports/ChartReport.cs index 376413b..417d708 100644 --- a/FamilyBudget/FamilyBudget/Reports/ChartReport.cs +++ b/FamilyBudget/FamilyBudget/Reports/ChartReport.cs @@ -46,7 +46,7 @@ namespace FamilyBudget.Reports .Where(x => x.Date.Date == dateTime.Date) .GroupBy(x => x.FamilyMemberId, (key, group) => new { Id = key, - Count = group.Sum(x => x.FamilyMember_Expenses.FirstOrDefault(x => x.ExpenseCategoryID == expenseId)?.Sum ?? 0) + Count = group.Sum(x => x.FamilyMember_Expenses.FirstOrDefault(x => x.ExpenseBudgetCategoryID == expenseId)?.Sum ?? 0) }) .Select(x => (x.Id.ToString(), (double)x.Count)) .ToList(); diff --git a/FamilyBudget/FamilyBudget/Reports/TableReport.cs b/FamilyBudget/FamilyBudget/Reports/TableReport.cs index 2605a4e..8f47bd5 100644 --- a/FamilyBudget/FamilyBudget/Reports/TableReport.cs +++ b/FamilyBudget/FamilyBudget/Reports/TableReport.cs @@ -34,7 +34,7 @@ namespace FamilyBudget.Reports { new ExcelBuilder(filePath) .AddHeader("Сводка по бюджету семьи", 0, 4) - .AddParagraph("за период", 0) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) .AddTable([15, 10, 15, 15], GetData(incomeId, expenseId, startDate, endDate)) .Build(); return true; @@ -50,22 +50,20 @@ namespace FamilyBudget.Reports { _logger.LogDebug("{json}", JsonConvert.SerializeObject(_expenseBudgetRepository.ReadExpenseBudgets())); var expenseData = _expenseBudgetRepository - .ReadExpenseBudgets() - .Where(x => x.Date >= startDate && x.Date <= endDate && x.FamilyMember_Expenses.Any(y => y.ExpenseCategoryID == expenseId)) + .ReadExpenseBudgets(dateFrom: startDate, dateTo: endDate, BudgetExpenseId: expenseId) .Select(x => new { - x.FamilyMemberId, + x.FullName, x.Date, CountIn = (int?)null, - CountOut = x.FamilyMember_Expenses.FirstOrDefault(y => y.ExpenseCategoryID == expenseId)?.Sum + CountOut = x.FamilyMember_Expenses.FirstOrDefault(y => y.ExpenseBudgetCategoryID == expenseId)?.Sum }); var incomeData = _incomeBudgetRepository - .ReadIncomeBudgets() - .Where(x => x.Date >= startDate && x.Date <= endDate && x.FamilyMember_Incomes.Any(y => y.IncomeBudgetCategoryId == incomeId)) + .ReadIncomeBudgets(dateFrom: startDate, dateTo: endDate, BudgetIncomeId: incomeId) .Select(x => new { - x.FamilyMemberId, + x.FullName, x.Date, CountIn = x.FamilyMember_Incomes.FirstOrDefault(y => y.IncomeBudgetCategoryId == incomeId)?.Sum, CountOut = (int?)null, @@ -77,15 +75,10 @@ namespace FamilyBudget.Reports return new List(){ item } .Union( - data.Select(x => new string[] { - x.FamilyMemberId.ToString(), x.Date.ToString(), x.CountIn?.ToString() ?? - string.Empty, x.CountOut?.ToString() ?? string.Empty - }) - ) + data.Select(x => new string[] {x.FullName, 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(); } } diff --git a/FamilyBudget/FamilyBudget/Repositories/Implementations/ExpenseBudgetRepository.cs b/FamilyBudget/FamilyBudget/Repositories/Implementations/ExpenseBudgetRepository.cs index c8ddca8..04a00eb 100644 --- a/FamilyBudget/FamilyBudget/Repositories/Implementations/ExpenseBudgetRepository.cs +++ b/FamilyBudget/FamilyBudget/Repositories/Implementations/ExpenseBudgetRepository.cs @@ -3,6 +3,7 @@ using FamilyBudget.Entities; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; +using ProjectFamilyBudget.Repositories.Implementations; using System; using System.Collections.Generic; using System.Linq; @@ -49,7 +50,7 @@ namespace FamilyBudget.Repositories.Implementations ExpenseBudgetId = expenseBudgetId, expenseBudget.FamilyMemberId, elem.Sum, - ExpensebudgetCategoryId = elem.ExpenseCategoryID + ExpensebudgetCategoryId = elem.ExpenseBudgetCategoryID }, transaction); } @@ -93,21 +94,70 @@ namespace FamilyBudget.Repositories.Implementations public IEnumerable ReadExpenseBudgets(DateTime? dateFrom = null, DateTime? dateTo = null, int? familyMemberId = null, int? BudgetExpenseId = null) { + _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("eb.Date >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("eb.Date<= @dateTo"); + } + if (familyMemberId.HasValue) + { + builder.AddCondition("eb.familyMemberId = @familyMemberId"); + } + if (BudgetExpenseId.HasValue) + { + builder.AddCondition("fmeb.ExpenseBudgetCategoryId = @BudgetExpenseId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT eb.*, fmeb.expensebudgetId, fmeb.sum, fmeb.ExpensebudgetCategoryId FROM ExpenseBudget eb - INNER JOIN familymember_expensebudget fmeb on fmeb.expensebudgetid = eb.id"; - var expensesBudget = connection.Query(querySelect); - //_logger.LogDebug("Полученные объекты: {json}", - //JsonConvert.SerializeObject(expensesBudget)); - return null; + var querySelect = $@"SELECT + eb.Id, + eb.FamilyMemberId, + CONCAT(fm.Name, ' ', f.Name) AS FullName, + eb.Date, + fmeb.ExpenseBudgetId, + fmeb.ExpenseBudgetCategoryId, + fmeb.Sum, + e.Name AS ExpenseName + FROM expenseBudget eb + LEFT JOIN familymember_expensebudget fmeb ON fmeb.expensebudgetid = eb.id + INNER JOIN Familymember fm ON fm.Id = eb.FamilyMemberId + LEFT JOIN Family f ON f.Id = fm.FamilyId + LEFT JOIN expensebudgetcategory e ON e.Id = fmeb.ExpenseBudgetCategoryId + {builder.Build()}"; + var expenseDict = new Dictionary>(); + var expenseBudget = connection.Query(querySelect, + (expense, fmExpense) => + { + if (!expenseDict.TryGetValue(expense.Id, out var fme)) + { + fme = []; + expenseDict.Add(expense.Id, fme); + } + + fme.Add(fmExpense); + return expense; + }, splitOn: "ExpenseBudgetCategoryId", param: new { dateFrom, dateTo, familyMemberId, BudgetExpenseId }); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(expenseBudget)); + + return expenseDict.Select(x => + { + var pi = expenseBudget.First(y => y.Id == x.Key); + pi.SetExpenseBudget(x.Value); + return pi; + }).ToArray(); } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); throw; } - } - } + } + } } diff --git a/FamilyBudget/FamilyBudget/Repositories/Implementations/IncomeBudgetRepository.cs b/FamilyBudget/FamilyBudget/Repositories/Implementations/IncomeBudgetRepository.cs index 5ec5459..8e84ede 100644 --- a/FamilyBudget/FamilyBudget/Repositories/Implementations/IncomeBudgetRepository.cs +++ b/FamilyBudget/FamilyBudget/Repositories/Implementations/IncomeBudgetRepository.cs @@ -99,48 +99,58 @@ namespace FamilyBudget.Repositories.Implementations var builder = new QueryBuilder(); if (dateFrom.HasValue) { - builder.AddCondition("pi.DataReciept >= @dateForm"); + builder.AddCondition("ib.Date >= @dateFrom"); } if (dateTo.HasValue) { - builder.AddCondition("pi.DataReciept <= @dateTo"); + builder.AddCondition("ib.Date <= @dateTo"); } if (familyMemberId.HasValue) { - builder.AddCondition("pi.PeopleId = @peopleId"); + builder.AddCondition("ib.familyMemberId = @familyMemberId"); } if (BudgetIncomeId.HasValue) { - builder.AddCondition("ipi.IncomeId = @incomeId"); + builder.AddCondition("fmib.IncomeBudgetCategoryId = @BudgetIncomeId"); } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = $@"SELECT ib.*, CONCAT(fm.Name, ' ', f.Name) as people, - fmib.incomebudgetId, fmib.sum, - fmib.incomebudgetcategoryid FROM incomeBudget ib - LEFT JOIN familymember_incomebudget fmib on fmib.incomebudgetid = ib.id - LEFT JOIN Familymember fm on fm.Id = fmib.familymemberid - LEFT JOIN Family f on f.Id = fm.familyid + var querySelect = $@"SELECT + ib.Id, + ib.FamilyMemberId, + CONCAT(fm.Name, ' ', f.Name) AS FullName, + ib.Date, + fmib.IncomeBudgetId, + fmib.IncomeBudgetCategoryId, + fmib.Sum, + i.Name AS IncomeName + FROM incomeBudget ib + LEFT JOIN familymember_incomebudget fmib ON fmib.incomebudgetid = ib.id + INNER JOIN Familymember fm ON fm.Id = ib.FamilyMemberId + LEFT JOIN Family f ON f.Id = fm.FamilyId + LEFT JOIN incomebudgetcategory i ON i.Id = fmib.IncomeBudgetCategoryId {builder.Build()}"; - // var incomeDict = new Dictionary>(); - // var peopleIncomes = connection.Query(querySelect, - // (income, peopleIncomes) => - // { - // if (!incomeDict.TryGetValue(income.Id, out var fmi)) - // { - // fmi = []; - // incomeDict.Add(income.Id, fmi); - // } + var incomeDict = new Dictionary>(); + var incomesBudget = connection.Query(querySelect, + (income, fmIncome) => + { + if (!incomeDict.TryGetValue(income.Id, out var fmi)) + { + fmi = []; + incomeDict.Add(income.Id, fmi); + } - // fmi.Add(peopleIncomes); - // return income; - // }, splitOn: "IncomeId", param: new { dateFrom, dateTo, familyMemberId, BudgetIncomeId }); - // _logger.LogDebug("Полученные объекты: {json}", + fmi.Add(fmIncome); + return income; + }, splitOn: "IncomeBudgetCategoryId", param: new { dateFrom, dateTo, familyMemberId, BudgetIncomeId }); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(incomesBudget)); - //_logger.LogDebug("Полученные объекты: {json}", - // JsonConvert.SerializeObject(incomesBudget)); - // return incomesBudget.GroupBy(x => x.Id, y => y, (key, value) => IncomeBudget.CreateOperation(value.First(), - // value.Select(z => FamilyMember_IncomeBudget.CreateElement(0, z.IncomeBudgetCategoryID, z.Id, z.Sum)))).ToList(); - return null; + return incomeDict.Select(x => + { + var pi = incomesBudget.First(y => y.Id == x.Key); + pi.SetIncomeBudget(x.Value); + return pi; + }).ToArray(); } catch (Exception ex) {