From 96d73d100b98eebe370972086a5c33fc312ec1e6 Mon Sep 17 00:00:00 2001 From: Kolobok73 Date: Fri, 20 Dec 2024 16:00:04 +0400 Subject: [PATCH] =?UTF-8?q?4=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectFamilyBudget/Entities/Expense.cs | 11 ++-- .../Entities/ExpensePeopleExpense.cs | 1 + .../ProjectFamilyBudget/Entities/Income.cs | 9 ++- .../Entities/IncomePeopleIncome.cs | 1 + .../ProjectFamilyBudget/Entities/People.cs | 15 +++-- .../Entities/PeopleExpense.cs | 20 ++++--- .../Entities/PeopleIncome.cs | 20 ++++--- .../Entities/TempExpensePeopleExpense.cs | 16 ----- .../Entities/TempIncomePeopleIncome.cs | 16 ----- .../ProjectFamilyBudget/Forms/FormExpenses.cs | 7 ++- .../ProjectFamilyBudget/Forms/FormIncomes.cs | 7 ++- .../Forms/FormPeopleExpense.cs | 2 +- .../Forms/FormPeopleExpenses.cs | 8 ++- .../Forms/FormPeopleIncome.cs | 2 +- .../Forms/FormPeopleIncomes.cs | 8 ++- .../ProjectFamilyBudget/Forms/FormPeoples.cs | 8 ++- .../Reports/ChartReport.cs | 13 ++-- .../Reports/TableReport.cs | 25 ++++---- .../PeopleExpenseRepository.cs | 54 +++++++++++++++-- .../Implementations/PeopleIncomeRepository.cs | 59 ++++++++++++++++--- .../Implementations/QueryBuilder.cs | 33 +++++++++++ 21 files changed, 240 insertions(+), 95 deletions(-) delete mode 100644 ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempExpensePeopleExpense.cs delete mode 100644 ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempIncomePeopleIncome.cs create mode 100644 ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/QueryBuilder.cs diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Expense.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Expense.cs index bb2a5db..6e22020 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Expense.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Expense.cs @@ -1,20 +1,23 @@ -using System; +using ProjectFamilyBudget.Entities.Enums; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; -using ProjectFamilyBudget.Entities.Enums; namespace ProjectFamilyBudget.Entities; public class Expense { public int Id { get; private set; } + [DisplayName("Тип расхода")] public IncomeExpenseType ExpenseType { get; private set; } + [DisplayName("Название")] public string Name { get; private set; } = string.Empty; + [DisplayName("Категория")] public string ExpenseCategory { get; private set; } = string.Empty; - - public static Expense CreateEntity(int id, IncomeExpenseType expenseType, string name, string expenseCategory) + public static Expense CreateEntity(int id,IncomeExpenseType expenseType, string name, string expenseCategory) { return new Expense { diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/ExpensePeopleExpense.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/ExpensePeopleExpense.cs index 2f5facf..8ac59c8 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/ExpensePeopleExpense.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/ExpensePeopleExpense.cs @@ -11,6 +11,7 @@ public class ExpensePeopleExpense public int PeopleExpenseId { get; private set; } public int ExpenseId { get; private set; } public int Sum { get; private set; } + public string ExpenseName { get; private set; } = string.Empty; public static ExpensePeopleExpense CreateElement(int peopleExpenseId, int expenseId, int sum) { return new ExpensePeopleExpense diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Income.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Income.cs index 08ed456..3404501 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Income.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/Income.cs @@ -1,17 +1,21 @@ -using System; +using ProjectFamilyBudget.Entities.Enums; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; -using ProjectFamilyBudget.Entities.Enums; namespace ProjectFamilyBudget.Entities; public class Income { public int Id { get; private set; } + [DisplayName("Тип дохода")] public IncomeExpenseType IncomeType { get; private set; } + [DisplayName("Название")] public string Name { get; private set; } = string.Empty; + [DisplayName("Категория")] public string IncomeCategory { get; private set; } = string.Empty; public static Income CreateEntity(int id, IncomeExpenseType incomeType, string name, string incomeCategory) @@ -25,4 +29,3 @@ public class Income }; } } - diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/IncomePeopleIncome.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/IncomePeopleIncome.cs index 45e8273..a6dd8b1 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/IncomePeopleIncome.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/IncomePeopleIncome.cs @@ -11,6 +11,7 @@ public class IncomePeopleIncome public int PeopleIncomeId { get; private set; } public int IncomeId { get; private set; } public int Sum { get; private set; } + public string IncomeName { get; private set; } = string.Empty; public static IncomePeopleIncome CreateElement(int peopleIncomeId,int incomeId, int sum) { return new IncomePeopleIncome diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/People.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/People.cs index ea9dc97..d58c829 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/People.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/People.cs @@ -1,20 +1,27 @@ -using System; +using Microsoft.VisualBasic.FileIO; +using ProjectFamilyBudget.Entities.Enums; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; -using ProjectFamilyBudget.Entities.Enums; namespace ProjectFamilyBudget.Entities; public class People { public int Id { get; private set; } + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + [DisplayName("Фамилия")] public string LastName { get; private set; } = string.Empty; - public int Age { get; private set; } + public string FullName => $"{Name} {LastName}"; + [DisplayName("Возраст")] + public int Age { get; private set; } + [DisplayName("Член семьи")] public FamilyMemberType MemberType { get; private set; } - public static People CreateEntity(int id, string name, string lastName, int age, FamilyMemberType memberType) + public static People CreateEntity(int id, string name,string lastName, int age, FamilyMemberType memberType) { return new People { diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleExpense.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleExpense.cs index dde00b6..65071d7 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleExpense.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleExpense.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,8 +10,16 @@ namespace ProjectFamilyBudget.Entities; public class PeopleExpense { public int Id { get; private set; } + [Browsable(false)] public int PeopleId { get; private set; } + [DisplayName("Человек")] + public string PeopleName { get; private set; } = string.Empty; + [DisplayName("Дата")] public DateTime DataReciept { get; private set; } + [DisplayName("Расходы")] + public string Expense => ExpensePeopleExpenses != null ? + string.Join(", ", ExpensePeopleExpenses.Select(x => $"{x.ExpenseName} {x.Sum}")) : string.Empty; + [Browsable(false)] public IEnumerable ExpensePeopleExpenses { get; private set; } = []; public static PeopleExpense CreateOperation(int id, int peopleId, DateTime dataReciept,IEnumerable expensePeopleExpenses) { @@ -22,14 +31,11 @@ public class PeopleExpense ExpensePeopleExpenses = expensePeopleExpenses }; } - public static PeopleExpense CreateOperation(TempExpensePeopleExpense tempExpensePeopleExpense, IEnumerable expensePeopleExpenses) + public void SetExpensePeopleExpenses(IEnumerable expensePeopleExpenses) { - return new PeopleExpense + if (expensePeopleExpenses != null && expensePeopleExpenses.Any()) { - Id = tempExpensePeopleExpense.Id, - PeopleId = tempExpensePeopleExpense.PeopleId, - DataReciept = tempExpensePeopleExpense.DataReciept, - ExpensePeopleExpenses = expensePeopleExpenses - }; + ExpensePeopleExpenses = expensePeopleExpenses; + } } } diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleIncome.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleIncome.cs index 8435df5..6120741 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleIncome.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/PeopleIncome.cs @@ -1,6 +1,7 @@ using ProjectFamilyBudget.Entities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,8 +11,16 @@ namespace ProjectFamilyBudget.Entities; public class PeopleIncome { public int Id { get; private set; } + [Browsable(false)] public int PeopleId { get; private set; } + [DisplayName("Человек")] + public string PeopleName { get; private set; } = string.Empty; + [DisplayName("Дата")] public DateTime DataReciept { get; private set; } + [DisplayName("Доходы")] + public string Income => IncomePeopleIncomes != null ? + string.Join(", ", IncomePeopleIncomes.Select(x => $"{x.IncomeName} {x.Sum}")) : string.Empty; + [Browsable(false)] public IEnumerable IncomePeopleIncomes { get; private set; } = []; public static PeopleIncome CreateOperation(int id, int peopleId,DateTime dataReciept,IEnumerable incomePeopleIncomes) { @@ -23,14 +32,11 @@ public class PeopleIncome IncomePeopleIncomes = incomePeopleIncomes }; } - public static PeopleIncome CreateOperation(TempIncomePeopleIncome tempIncomePeopleIncome, IEnumerable incomePeopleIncomes) + public void SetIncomePeopleIncomes(IEnumerable incomePeopleIncomes) { - return new PeopleIncome + if (incomePeopleIncomes != null && incomePeopleIncomes.Any()) { - Id = tempIncomePeopleIncome.Id, - PeopleId = tempIncomePeopleIncome.PeopleId, - DataReciept = tempIncomePeopleIncome.DataReciept, - IncomePeopleIncomes = incomePeopleIncomes - }; + IncomePeopleIncomes = incomePeopleIncomes; + } } } diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempExpensePeopleExpense.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempExpensePeopleExpense.cs deleted file mode 100644 index 41a1f25..0000000 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempExpensePeopleExpense.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectFamilyBudget.Entities; - -public class TempExpensePeopleExpense -{ - public int Id { get; private set; } - public int PeopleId { get; private set; } - public DateTime DataReciept { get; private set; } - public int ExpenseId { get; private set; } - public int Sum { get; private set; } -} diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempIncomePeopleIncome.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempIncomePeopleIncome.cs deleted file mode 100644 index 31eb880..0000000 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Entities/TempIncomePeopleIncome.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectFamilyBudget.Entities; - -public class TempIncomePeopleIncome -{ - public int Id { get; private set; } - public int PeopleId { get; private set; } - public DateTime DataReciept { get; private set; } - public int IncomeId { get; private set; } - public int Sum { get; private set; } -} diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormExpenses.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormExpenses.cs index d8aaa58..25201e6 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormExpenses.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormExpenses.cs @@ -93,7 +93,12 @@ namespace ProjectFamilyBudget.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridViewData.DataSource = _expense.ReadExpense(); + private void LoadList() + { + dataGridViewData.DataSource = _expense.ReadExpense(); + dataGridViewData.Columns["Id"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormIncomes.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormIncomes.cs index 09f1ae8..03a1100 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormIncomes.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormIncomes.cs @@ -94,7 +94,12 @@ namespace ProjectFamilyBudget.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridViewData.DataSource = _income.ReadIncome(); + private void LoadList() + { + dataGridViewData.DataSource = _income.ReadIncome(); + dataGridViewData.Columns["Id"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpense.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpense.cs index 639110e..78b8eb1 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpense.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpense.cs @@ -21,7 +21,7 @@ namespace ProjectFamilyBudget.Forms _peopleEpxense = peopleEpxense ?? throw new ArgumentNullException(nameof(peopleEpxense)); comboBoxPeople.DataSource = people.ReadPeople(); - comboBoxPeople.DisplayMember = "Name"; + comboBoxPeople.DisplayMember = "FullName"; comboBoxPeople.ValueMember = "Id"; ColumnExpense.DataSource = expense.ReadExpense(); diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpenses.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpenses.cs index 6d7f84c..a8fdf14 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpenses.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleExpenses.cs @@ -76,7 +76,13 @@ namespace ProjectFamilyBudget.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridViewData.DataSource = _peopleExpense.ReadPeopleExpense(); + private void LoadList() + { + dataGridViewData.DataSource = _peopleExpense.ReadPeopleExpense(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["DataReciept"].DefaultCellStyle.Format = "dd MMMM yyyy"; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncome.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncome.cs index e35e52e..f94ae6a 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncome.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncome.cs @@ -21,7 +21,7 @@ namespace ProjectFamilyBudget.Forms _peopleIncome = peopleIncome ?? throw new ArgumentNullException(nameof(peopleIncome)); comboBoxPeople.DataSource = people.ReadPeople(); - comboBoxPeople.DisplayMember = "Name"; + comboBoxPeople.DisplayMember = "FullName"; comboBoxPeople.ValueMember = "Id"; ColumnIncome.DataSource = income.ReadIncome(); diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncomes.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncomes.cs index b1f19f1..9a30951 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncomes.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeopleIncomes.cs @@ -74,7 +74,13 @@ namespace ProjectFamilyBudget.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridViewData.DataSource = _peopleIncome.ReadPeopleIncome(); + private void LoadList() + { + dataGridViewData.DataSource = _peopleIncome.ReadPeopleIncome(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["DataReciept"].DefaultCellStyle.Format = "dd MMMM yyyy"; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeoples.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeoples.cs index ed6c174..2196058 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeoples.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Forms/FormPeoples.cs @@ -92,7 +92,13 @@ namespace ProjectFamilyBudget.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridViewData.DataSource = _people.ReadPeople(); + private void LoadList() + { + dataGridViewData.DataSource = _people.ReadPeople(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Reports/ChartReport.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Reports/ChartReport.cs index ca82f34..ef0490c 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Reports/ChartReport.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Reports/ChartReport.cs @@ -25,8 +25,8 @@ public class ChartReport { new PdfBuilder(filePath) .AddHeader("Траты людей") - .AddPieChart("Виды трат", GetData(expenseId, dateTime)) - .Build(); + .AddPieChart($"Траты за {dateTime:dd MMMM yyyy}", GetData(expenseId, dateTime)) + .Build(); return true; } catch (Exception ex) @@ -38,14 +38,13 @@ public class ChartReport private List<(string Caption, double Value)> GetData(int expenseId, DateTime dateTime) { return _peopleExpense - .ReadPeopleExpense() - .Where(x => x.DataReciept.Date == dateTime.Date) - .GroupBy(x => x.PeopleId, (key, group) => new + .ReadPeopleExpense(dateForm: dateTime.Date, dateTo: dateTime.Date.AddDays(1),expenseId: expenseId) + .GroupBy(x => x.PeopleName, (key, group) => new { - Id = key, + PeopleName = key, Count = group.Sum(x => x.ExpensePeopleExpenses.FirstOrDefault(y => y.ExpenseId == expenseId)?.Sum ?? 0) }) - .Select(x => (x.Id.ToString(), (double)x.Count)) + .Select(x => (x.PeopleName, (double)x.Count)) .ToList(); } } diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Reports/TableReport.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Reports/TableReport.cs index 6f36aaf..9d015e0 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Reports/TableReport.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Reports/TableReport.cs @@ -26,7 +26,7 @@ public class TableReport { 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; @@ -40,21 +40,22 @@ public class TableReport private List GetData(int incomeId,int expenseId, DateTime startDate, DateTime endDate) { var data = _peopleIncomeRepository - .ReadPeopleIncome() - .Where(x => x.DataReciept >= startDate && x.DataReciept <= endDate && x.IncomePeopleIncomes.Any(y => y.IncomeId == incomeId)) - .Select(x => new { x.PeopleId, Date = x.DataReciept, CountIn = x.IncomePeopleIncomes.FirstOrDefault(y => y.IncomeId == incomeId)?.Sum, CountOut = (int?)null }) + .ReadPeopleIncome(dateForm: startDate, dateTo: endDate, incomeId: incomeId) + .Select(x => new { x.PeopleName, Date = x.DataReciept, + CountIn = x.IncomePeopleIncomes.FirstOrDefault(y => y.IncomeId == incomeId)?.Sum, CountOut = (int?)null }) .Union( - _peopleExpenseRepository - .ReadPeopleExpense() - .Where(x => x.DataReciept >= startDate && x.DataReciept <= endDate && x.ExpensePeopleExpenses.Any(y => y.ExpenseId == expenseId)) - .Select(x => new { x.PeopleId, Date = x.DataReciept, CountIn = (int?)null, CountOut = x.ExpensePeopleExpenses.FirstOrDefault(y => y.ExpenseId == expenseId)?.Sum })) - .OrderBy(x => x.Date); + _peopleExpenseRepository + .ReadPeopleExpense(dateForm: startDate, dateTo: endDate, expenseId: expenseId) + .Select(x => new { x.PeopleName, Date = x.DataReciept, CountIn = (int?)null, + CountOut = x.ExpensePeopleExpenses.FirstOrDefault(y => y.ExpenseId == expenseId)?.Sum })) + .OrderBy(x => x.Date); return new List() { item } - .Union(data.Select(x => new string[] {x.PeopleId.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() ]] - ) + data.Select(x => new string[] {x.PeopleName, 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("N0"), data.Sum(x => x.CountOut ?? 0).ToString("N0") ]]) .ToList(); } } diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleExpenseRepository.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleExpenseRepository.cs index 05f0812..d191fe2 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleExpenseRepository.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleExpenseRepository.cs @@ -90,14 +90,58 @@ public class PeopleExpenseRepository : IPeopleExpense _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateForm.HasValue) + { + builder.AddCondition("pe.DataReciept >= @dateForm"); + } + if (dateTo.HasValue) + { + builder.AddCondition("pe.DataReciept <= @dateTo"); + } + if (peopleId.HasValue) + { + builder.AddCondition("pe.PeopleId = @peopleId"); + } + if (expenseId.HasValue) + { + builder.AddCondition("epe.ExpenseId = @expenseId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT pe.*, epe.ExpenseId, epe.Sum FROM PeopleExpense pe - INNER JOIN ExpensePeopleExpense epe on epe.PeopleExpenseId = pe.Id"; - var peopleExpenses = connection.Query(querySelect); + var querySelect = $@"SELECT + pe.*, + CONCAT(p.Name, ' ', p.LastName) as PeopleName, + epe.ExpenseId, + epe.Sum, + e.Name as ExpenseName + FROM PeopleExpense pe + LEFT JOIN People p on p.Id = pe.PeopleId + INNER JOIN ExpensePeopleExpense epe on epe.PeopleExpenseId = pe.Id + LEFT JOIN Expense e on e.Id = epe.ExpenseId + {builder.Build()}"; + var expenseDict = new Dictionary>(); + + var peopleExpenses = connection.Query(querySelect, + (expense, peopleExpenses) => + { + if (!expenseDict.TryGetValue(expense.Id, out var epe)) + { + epe = []; + expenseDict.Add(expense.Id, epe); + } + + epe.Add(peopleExpenses); + return expense; + }, splitOn: "ExpenseId", param: new { dateForm, dateTo, peopleId, expenseId }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(peopleExpenses)); - return peopleExpenses.GroupBy(x => x.Id, y => y, (key, value) => PeopleExpense.CreateOperation(value.First(), - value.Select(z => ExpensePeopleExpense.CreateElement(0, z.ExpenseId, z.Sum)))).ToList(); + + return expenseDict.Select(x => + { + var pe = peopleExpenses.First(y => y.Id == x.Key); + pe.SetExpensePeopleExpenses(x.Value); + return pe; + }).ToArray(); } catch (Exception ex) { diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleIncomeRepository.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleIncomeRepository.cs index 16c5bf1..3bf094a 100644 --- a/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleIncomeRepository.cs +++ b/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/PeopleIncomeRepository.cs @@ -9,7 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Runtime.InteropServices.JavaScript.JSType; -using System.Windows.Forms; +using System.Windows.Forms; using Unity; namespace ProjectFamilyBudget.Repositories.Implementations; @@ -93,13 +93,58 @@ public class PeopleIncomeRepository : IPeopleIncome _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateForm.HasValue) + { + builder.AddCondition("pi.DataReciept >= @dateForm"); + } + if (dateTo.HasValue) + { + builder.AddCondition("pi.DataReciept <= @dateTo"); + } + if (peopleId.HasValue) + { + builder.AddCondition("pi.PeopleId = @peopleId"); + } + if (incomeId.HasValue) + { + builder.AddCondition("ipi.IncomeId = @incomeId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT pi.*, ipi.IncomeId, ipi.Sum FROM PeopleIncome pi - INNER JOIN IncomePeopleIncome ipi on ipi.PeopleIncomeId = pi.Id"; - var peopleIncomes = connection.Query(querySelect); - _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(peopleIncomes)); - return peopleIncomes.GroupBy(x => x.Id, y => y, (key, value) => PeopleIncome.CreateOperation(value.First(), - value.Select(z => IncomePeopleIncome.CreateElement(0, z.IncomeId, z.Sum)))).ToList(); + var querySelect = $@"SELECT + pi.*, + CONCAT(p.Name, ' ', p.LastName) as PeopleName, + ipi.IncomeId, + ipi.Sum, + i.Name as IncomeName + FROM PeopleIncome pi + LEFT JOIN People p on p.Id = pi.PeopleId + INNER JOIN IncomePeopleIncome ipi on ipi.PeopleIncomeId = pi.Id + LEFT JOIN Income i on i.Id = ipi.IncomeId + {builder.Build()}"; + var incomeDict = new Dictionary>(); + + var peopleIncomes = connection.Query(querySelect, + (income, peopleIncomes) => + { + if (!incomeDict.TryGetValue(income.Id, out var ipi)) + { + ipi = []; + incomeDict.Add(income.Id, ipi); + } + + ipi.Add(peopleIncomes); + return income; + }, splitOn: "IncomeId", param: new { dateForm, dateTo, peopleId, incomeId }); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(peopleIncomes)); + + return incomeDict.Select(x => + { + var pi = peopleIncomes.First(y => y.Id == x.Key); + pi.SetIncomePeopleIncomes(x.Value); + return pi; + }).ToArray(); } catch (Exception ex) { diff --git a/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/QueryBuilder.cs b/ProjectFamilyBudget/ProjectFamilyBudget/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..4aa5291 --- /dev/null +++ b/ProjectFamilyBudget/ProjectFamilyBudget/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 ProjectFamilyBudget.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}"; + } +}