using Microsoft.Extensions.Logging; using ProjectGSM.Repositories; namespace ProjectGSM.Documents; public class ChartReport { private readonly ICaseRepository _caseRepository; private readonly ICaseAdvocateRepository _caseAdvocateRepository; private readonly IAdvocateRepository _advocateRepository; private readonly ILogger _logger; public ChartReport(ICaseRepository caseRepository, IAdvocateRepository advocateRepository, ICaseAdvocateRepository caseAdvocateRepository, ILogger logger) { _caseRepository = caseRepository ?? throw new ArgumentNullException(nameof(caseRepository)); _advocateRepository = advocateRepository ?? throw new ArgumentNullException(nameof(advocateRepository)); _caseAdvocateRepository = caseAdvocateRepository ?? throw new ArgumentNullException(nameof(caseAdvocateRepository)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public bool CreateChart(string filePath, DateTime dateTime) { try { new PdfBuilder(filePath) .AddHeader("Доля выручки адвоката") .AddPieChart($"Всего до: {dateTime.Date}", GetData(dateTime)) .Build(); return true; } catch (Exception ex) { _logger.LogError(ex, "Ошибка при формировании документа"); return false; } } private List<(string, double)> GetData(DateTime dateTime) { try { return _caseAdvocateRepository .ReadCaseAdvocates(dateTo: dateTime.Date.AddDays(1)) .Join(_caseRepository.ReadCases(dateTime.Date.AddDays(1)), caseItem => caseItem.CaseId, caseCaseId => caseCaseId.Id, (caseItem, caseCase) => new { caseItem.AdvocateName, caseCase.Payment, caseCase.Verdict, caseCase.Price, caseCase.VictoryPrice }) .GroupBy(x => x.AdvocateName) .Select(g => (g.Key, Sum: g.Sum(x => x.Payment ? (x.Verdict ? (double)(x.Price + x.VictoryPrice) : (double)x.Price) : 0))) .ToList(); } catch (Exception ex) { _logger.LogError(ex, "Error occurred while calculating advocate earnings"); return new List<(string, double)>(); } } }