using Microsoft.Extensions.Logging; using ProjectFamilyBudget.Repositories; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProjectFamilyBudget.Reports; public class TableReport { private readonly IPeopleIncome _peopleIncomeRepository; private readonly IPeopleExpense _peopleExpenseRepository; private readonly ILogger _logger; internal static readonly string[] item = ["Название операции", "Дата", "Заработано", "Потрачено"]; public TableReport(IPeopleIncome peopleIncomeRepository, IPeopleExpense peopleExpenseRepository, ILogger logger) { _peopleIncomeRepository = peopleIncomeRepository ?? throw new ArgumentNullException(nameof(peopleIncomeRepository)); _peopleExpenseRepository = peopleExpenseRepository ?? throw new ArgumentNullException(nameof(peopleExpenseRepository)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public bool CreateTable(string filePath, int incomeId, int expenseId, DateTime startDate, DateTime endDate) { try { new ExcelBuilder(filePath) .AddHeader("Сводка по движению денег", 0, 3) .AddParagraph("за период", 0) .AddTable([15, 10, 15, 15], GetData(incomeId, expenseId, startDate, endDate)) .Build(); return true; } catch (Exception ex) { _logger.LogError(ex, "Ошибка при формировании документа"); return false; } } 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 }) .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); 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() ]] ) .ToList(); } }