diff --git a/project/ProjectTourAgency/Enities/TempClientTour.cs b/project/ProjectTourAgency/Enities/.cs similarity index 100% rename from project/ProjectTourAgency/Enities/TempClientTour.cs rename to project/ProjectTourAgency/Enities/.cs diff --git a/project/ProjectTourAgency/Enities/AddMoney.cs b/project/ProjectTourAgency/Enities/AddMoney.cs index 3865dfe..fd04059 100644 --- a/project/ProjectTourAgency/Enities/AddMoney.cs +++ b/project/ProjectTourAgency/Enities/AddMoney.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,10 +9,21 @@ namespace ProjectTourAgency.Enities { public class AddMoney { + + [Browsable(false)] public int Id { get; private set; } + + [DisplayName("ID Клиента")] public int ClientId { get; private set; } + + [DisplayName("Дата")] public DateTime Date { get; private set; } - public int MoneyAmount{ get; private set; } + + [DisplayName("Размер Пополнение")] + public int MoneyAmount { get; private set; } + + [DisplayName("Клиент")] + public string ClientName { get; private set; } = string.Empty; public static AddMoney CreateEntity(int id,int cId, DateTime date, int money) diff --git a/project/ProjectTourAgency/Enities/Client.cs b/project/ProjectTourAgency/Enities/Client.cs index ab529c4..87c21dc 100644 --- a/project/ProjectTourAgency/Enities/Client.cs +++ b/project/ProjectTourAgency/Enities/Client.cs @@ -1,6 +1,7 @@ using ProjectTourAgency.Enities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,11 +10,22 @@ namespace ProjectTourAgency.Enities; public class Client { + public int Id { get; private set; } + + [DisplayName("Полное имя")] public string FullName { get; private set; } = string.Empty; + + [DisplayName("Дата рождения")] public DateTime BirthDate { get; private set; } + + [DisplayName("Номер телефона")] public string PhoneNumber { get; private set; } = string.Empty; + + [DisplayName("Статус клиента")] public ClientStatus ClientStatus { get; private set; } + + [DisplayName("Баланс")] public int Money { get; private set; } public static Client CreateEntity(int id, string fullName, diff --git a/project/ProjectTourAgency/Enities/ClientTour.cs b/project/ProjectTourAgency/Enities/ClientTour.cs index a05bd98..ea01ee4 100644 --- a/project/ProjectTourAgency/Enities/ClientTour.cs +++ b/project/ProjectTourAgency/Enities/ClientTour.cs @@ -11,6 +11,8 @@ public class ClientTour { public int Id { get; private set; } public int ClientId { get; private set; } + + public string CLientName { get; private set; } = String.Empty; public int TourId { get; private set; } public int Cost { get; private set; } diff --git a/project/ProjectTourAgency/Enities/Employee.cs b/project/ProjectTourAgency/Enities/Employee.cs index 1ee2ff2..7f8a6e8 100644 --- a/project/ProjectTourAgency/Enities/Employee.cs +++ b/project/ProjectTourAgency/Enities/Employee.cs @@ -1,6 +1,7 @@ using ProjectTourAgency.Enities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,10 +11,16 @@ namespace ProjectTourAgency.Enities; public class Employee { public int Id { get; private set; } + + [DisplayName("Полное имя")] public string FullName { get; private set; } = string.Empty; + public string EmployeeName => $"{EmployeeJob} {FullName}"; + + [DisplayName("Должность")] public EmpoyeeJob EmployeeJob { get; private set; } + public static Employee CreateEntity(int id, string fullName, EmpoyeeJob job) { diff --git a/project/ProjectTourAgency/Enities/Route.cs b/project/ProjectTourAgency/Enities/Route.cs index 09e80b9..fb8aab6 100644 --- a/project/ProjectTourAgency/Enities/Route.cs +++ b/project/ProjectTourAgency/Enities/Route.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,9 +10,17 @@ namespace ProjectTourAgency.Enities; public class Route { public int Id { get; private set; } + + [DisplayName("Место назначения")] public string Destination { get; private set; } = string.Empty; + + [DisplayName("Место отбытия")] public string Departure { get; private set; } = string.Empty; + + [DisplayName("Продолжительность")] public int Duration { get; private set; } + + public string DepartureDestination => $"{Departure} - {Destination}"; public static Route CreateEntity(int id, string destination, string departure, int duration) { diff --git a/project/ProjectTourAgency/Enities/Tour.cs b/project/ProjectTourAgency/Enities/Tour.cs index fa545b2..1ef9bcc 100644 --- a/project/ProjectTourAgency/Enities/Tour.cs +++ b/project/ProjectTourAgency/Enities/Tour.cs @@ -1,6 +1,7 @@ using ProjectTourAgency.Enities.Enums; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,11 +10,34 @@ namespace ProjectTourAgency.Enities; public class Tour { + + [DisplayName("Id Тура")] public int Id { get; private set; } + + [Browsable(false)] public int EmployeeId { get; private set; } + + [Browsable(false)] public int RouteId { get; private set; } + + [DisplayName("Сотрудник")] + + public string EmployeeName { get; private set; } = string.Empty; + + [DisplayName("Маршрут")] + + public string RouteName { get; private set; } = string.Empty; + + [DisplayName("Дата начала тура")] public DateTime DepartureDate { get; private set; } + + [Browsable(false)] public IEnumerable ClientTours { get; private set; } = []; + + [DisplayName("Клиенты")] + public string Clients => ClientTours != null ? + string.Join(",", ClientTours.Select(x => $"{x.CLientName} {x.Cost}")) : string.Empty; + public static Tour CreateEntity(int id, int employeeId, int routeId, DateTime date,IEnumerable clientTours) { @@ -38,4 +62,12 @@ public class Tour ClientTours = clientTours }; } + + public void SetClientTours(IEnumerable clientTours) + { + if(clientTours != null && clientTours.Any()) + { + ClientTours = clientTours; + } + } } diff --git a/project/ProjectTourAgency/Forms/FormAddMoney.cs b/project/ProjectTourAgency/Forms/FormAddMoney.cs index 918074d..bd1382e 100644 --- a/project/ProjectTourAgency/Forms/FormAddMoney.cs +++ b/project/ProjectTourAgency/Forms/FormAddMoney.cs @@ -20,9 +20,9 @@ namespace ProjectTourAgency.Forms InitializeComponent(); _addMoneyRepository = addMoneyRepository ?? throw new ArgumentNullException(nameof(addMoneyRepository)); - comboBoxClientId.DataSource = clientRepository.ReadClients(); - comboBoxClientId.DisplayMember = "Name"; - comboBoxClientId.ValueMember = "Id"; + comboBoxClientId.DataSource = addMoneyRepository.ReadAddMoneys(); + comboBoxClientId.DisplayMember = "ClientName"; + comboBoxClientId.ValueMember = "ClientId"; } private void buttonSave_Click(object sender, EventArgs e) diff --git a/project/ProjectTourAgency/Forms/FormAddMoneys.cs b/project/ProjectTourAgency/Forms/FormAddMoneys.cs index 8b9ae68..a7233a6 100644 --- a/project/ProjectTourAgency/Forms/FormAddMoneys.cs +++ b/project/ProjectTourAgency/Forms/FormAddMoneys.cs @@ -51,7 +51,13 @@ namespace ProjectTourAgency.Forms } - private void LoadList() => dataGridViewData.DataSource = _addMoneyRepository.ReadAddMoneys(); + private void LoadList() + { + dataGridViewData.DataSource = _addMoneyRepository.ReadAddMoneys(); + dataGridViewData.Columns["Date"].DefaultCellStyle.Format = "dd.MM.yy"; + + } + private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/project/ProjectTourAgency/Forms/FormClientTour.cs b/project/ProjectTourAgency/Forms/FormClientTour.cs index f1cfe34..472b343 100644 --- a/project/ProjectTourAgency/Forms/FormClientTour.cs +++ b/project/ProjectTourAgency/Forms/FormClientTour.cs @@ -25,11 +25,11 @@ namespace ProjectTourAgency.Forms _tourRepository = tourRepository ?? throw new ArgumentNullException(nameof(tourRepository)); comboBoxEmployeeId.DataSource = employeeRepository.ReadEmployees(); - comboBoxEmployeeId.DisplayMember = "FullName"; + comboBoxEmployeeId.DisplayMember = "EmployeeName"; comboBoxEmployeeId.ValueMember = "Id"; comboBoxRouteId.DataSource = routeRepository.ReadRoutes(); - comboBoxRouteId.DisplayMember = "Destination"; + comboBoxRouteId.DisplayMember = "DepartureDestination"; comboBoxRouteId.ValueMember = "Id"; ColumnClient.DataSource = clientRepository.ReadClients(); diff --git a/project/ProjectTourAgency/Forms/FormClients.cs b/project/ProjectTourAgency/Forms/FormClients.cs index b557f14..4eb7ed2 100644 --- a/project/ProjectTourAgency/Forms/FormClients.cs +++ b/project/ProjectTourAgency/Forms/FormClients.cs @@ -1,4 +1,5 @@ -using ProjectTourAgency.Repositories; +using ProjectTourAgency.Implementations; +using ProjectTourAgency.Repositories; using System; using System.Collections.Generic; using System.ComponentModel; @@ -93,8 +94,13 @@ namespace ProjectTourAgency.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/project/ProjectTourAgency/Forms/FormEmployees.cs b/project/ProjectTourAgency/Forms/FormEmployees.cs index 2e8bdae..c4cc86d 100644 --- a/project/ProjectTourAgency/Forms/FormEmployees.cs +++ b/project/ProjectTourAgency/Forms/FormEmployees.cs @@ -95,8 +95,13 @@ namespace ProjectTourAgency.Forms } } - private void LoadList() => dataGridViewData.DataSource = _employeeRepository.ReadEmployees(); + private void LoadList() + { + dataGridViewData.DataSource = _employeeRepository.ReadEmployees(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["EmployeeName"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/project/ProjectTourAgency/Forms/FormExcelReport.Designer.cs b/project/ProjectTourAgency/Forms/FormExcelReport.Designer.cs index 2a0c9ed..fbe0ddb 100644 --- a/project/ProjectTourAgency/Forms/FormExcelReport.Designer.cs +++ b/project/ProjectTourAgency/Forms/FormExcelReport.Designer.cs @@ -34,62 +34,106 @@ buttonMakeReport = new Button(); comboBoxTour = new ComboBox(); textBoxFilePath = new TextBox(); + labelFilePAth = new Label(); + label1 = new Label(); + label2 = new Label(); + label3 = new Label(); SuspendLayout(); // // dateTimePickerDateEnd // - dateTimePickerDateEnd.Location = new Point(58, 155); + dateTimePickerDateEnd.Location = new Point(148, 221); dateTimePickerDateEnd.Name = "dateTimePickerDateEnd"; - dateTimePickerDateEnd.Size = new Size(201, 31); + dateTimePickerDateEnd.Size = new Size(280, 31); dateTimePickerDateEnd.TabIndex = 0; // // dateTimePickerDateBegin // - dateTimePickerDateBegin.Location = new Point(58, 105); + dateTimePickerDateBegin.Location = new Point(148, 164); dateTimePickerDateBegin.Name = "dateTimePickerDateBegin"; - dateTimePickerDateBegin.Size = new Size(201, 31); + dateTimePickerDateBegin.Size = new Size(280, 31); dateTimePickerDateBegin.TabIndex = 1; // // buttonSelectFilePath // - buttonSelectFilePath.Location = new Point(148, 47); + buttonSelectFilePath.Location = new Point(396, 59); buttonSelectFilePath.Name = "buttonSelectFilePath"; - buttonSelectFilePath.Size = new Size(112, 34); + buttonSelectFilePath.Size = new Size(32, 34); buttonSelectFilePath.TabIndex = 2; - buttonSelectFilePath.Text = "button1"; + buttonSelectFilePath.Text = ".."; buttonSelectFilePath.UseVisualStyleBackColor = true; buttonSelectFilePath.Click += buttonSelectFilePath_Click; // // buttonMakeReport // - buttonMakeReport.Location = new Point(144, 234); + buttonMakeReport.Location = new Point(148, 278); buttonMakeReport.Name = "buttonMakeReport"; - buttonMakeReport.Size = new Size(112, 34); + buttonMakeReport.Size = new Size(182, 34); buttonMakeReport.TabIndex = 3; - buttonMakeReport.Text = "button2"; + buttonMakeReport.Text = "Сформировать"; buttonMakeReport.UseVisualStyleBackColor = true; buttonMakeReport.Click += buttonMakeReport_Click; // // comboBoxTour // comboBoxTour.FormattingEnabled = true; - comboBoxTour.Location = new Point(298, 157); + comboBoxTour.Location = new Point(148, 110); comboBoxTour.Name = "comboBoxTour"; comboBoxTour.Size = new Size(182, 33); comboBoxTour.TabIndex = 4; // // textBoxFilePath // - textBoxFilePath.Location = new Point(279, 47); + textBoxFilePath.Location = new Point(148, 59); textBoxFilePath.Name = "textBoxFilePath"; - textBoxFilePath.Size = new Size(150, 31); + textBoxFilePath.Size = new Size(242, 31); textBoxFilePath.TabIndex = 5; // + // labelFilePAth + // + labelFilePAth.AutoSize = true; + labelFilePAth.Location = new Point(12, 47); + labelFilePAth.Name = "labelFilePAth"; + labelFilePAth.Size = new Size(118, 25); + labelFilePAth.TabIndex = 6; + labelFilePAth.Text = "Путь к файлу"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(12, 118); + label1.Name = "label1"; + label1.Size = new Size(73, 25); + label1.TabIndex = 7; + label1.Text = "ID Тура"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(12, 169); + label2.Name = "label2"; + label2.Size = new Size(110, 25); + label2.TabIndex = 8; + label2.Text = "Дата начала"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(12, 221); + label3.Name = "label3"; + label3.Size = new Size(105, 25); + label3.TabIndex = 9; + label3.Text = "Дата Конца"; + // // FormExcelReport // AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); + ClientSize = new Size(507, 342); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(labelFilePAth); Controls.Add(textBoxFilePath); Controls.Add(comboBoxTour); Controls.Add(buttonMakeReport); @@ -110,5 +154,9 @@ private Button buttonMakeReport; private ComboBox comboBoxTour; private TextBox textBoxFilePath; + private Label labelFilePAth; + private Label label1; + private Label label2; + private Label label3; } } \ No newline at end of file diff --git a/project/ProjectTourAgency/Forms/FormRoutes.cs b/project/ProjectTourAgency/Forms/FormRoutes.cs index e9ce87e..b0bbfac 100644 --- a/project/ProjectTourAgency/Forms/FormRoutes.cs +++ b/project/ProjectTourAgency/Forms/FormRoutes.cs @@ -1,4 +1,5 @@ using ProjectRouteAgency.Repositories; +using ProjectTourAgency.Implementations; using ProjectTourAgency.Repositories; using System; using System.Collections.Generic; @@ -94,8 +95,13 @@ namespace ProjectTourAgency.Forms } } - private void LoadList() => dataGridViewData.DataSource = _routeRepository.ReadRoutes(); + private void LoadList() + { + dataGridViewData.DataSource = _routeRepository.ReadRoutes(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["DepartureDestination"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/project/ProjectTourAgency/Implementations/AddMoneyRepository.cs b/project/ProjectTourAgency/Implementations/AddMoneyRepository.cs index 115c497..bc02dda 100644 --- a/project/ProjectTourAgency/Implementations/AddMoneyRepository.cs +++ b/project/ProjectTourAgency/Implementations/AddMoneyRepository.cs @@ -103,14 +103,38 @@ WHERE Id = @Id"; } } - public IEnumerable ReadAddMoneys() + public IEnumerable ReadAddMoneys(DateTime? dateFrom = null, DateTime? dateTo = null, int? addMoneyId = null, int? clientId = null) { _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("am.Date >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("am.Date <= @dateTo"); + } + if (addMoneyId.HasValue) + { + builder.AddCondition("am.Id =@addMoneyId"); + } + if (clientId.HasValue) + { + builder.AddCondition("am.ClientId =@clientId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT * FROM AddMoneys"; - var AddMoneys = connection.Query(querySelect); + var querySelect = $@"SELECT + am.*, + c.FullName AS ClientName +FROM + AddMoneys am +LEFT JOIN + Clients c ON c.Id = am.ClientId +{builder.Build()}"; + var AddMoneys = connection.Query(querySelect, new {dateFrom, dateTo, addMoneyId, clientId}); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(AddMoneys)); return AddMoneys; diff --git a/project/ProjectTourAgency/Implementations/QueryBuilder.cs b/project/ProjectTourAgency/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..2f984fc --- /dev/null +++ b/project/ProjectTourAgency/Implementations/QueryBuilder.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectTourAgency.Implementations; + +internal 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}"; + } +} + diff --git a/project/ProjectTourAgency/Implementations/TourRepository.cs b/project/ProjectTourAgency/Implementations/TourRepository.cs index f78bf25..92e4687 100644 --- a/project/ProjectTourAgency/Implementations/TourRepository.cs +++ b/project/ProjectTourAgency/Implementations/TourRepository.cs @@ -76,22 +76,69 @@ WHERE Id = @id"; } - public IEnumerable ReadTours() + public IEnumerable ReadTours(DateTime? dateFrom = null, DateTime? dateTo = null, int? tourId = null, int? clientId = null) { _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("t.DepartureDate >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("t.DepartureDate <= @dateTo"); + } + if(tourId.HasValue) + { + builder.AddCondition("t.Id = @tourId"); + } + + + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" -SELECT t.*, ct.TourId, ct.Cost, ct.ClientId FROM Tour t -INNER JOIN ClientTour ct ON ct.TourId = t.Id"; - var tour = connection.Query(querySelect); - _logger.LogDebug("Получение объектов {json}", JsonConvert.SerializeObject(tour)); - return tour.GroupBy( - x => x.Id, y => y, - (key, value) => Tour.CreateEntity(value.First(), - value.Select(z => ClientTour.CreateEntity(0,z.ClientId, z.Id,z.Cost)) - )).ToList(); + var querySelect = $@" +SELECT + t.*, + CONCAT(r.Departure,'-', r.Destination) AS RouteName, + e.FullName AS EmployeeName, + ct.ClientId, + ct.Cost, + c.FullName AS ClientName +FROM + Tour t +LEFT JOIN + Routes r ON r.Id = t.RouteId +LEFT JOIN + Employees e ON e.Id = t.EmployeeId +LEFT JOIN + ClientTour ct ON ct.TourId = t.Id +LEFT JOIN + Clients c ON c.Id = ct.ClientId +{builder.Build()}"; + + var clientTourDict = new Dictionary>(); + + var tours = connection.Query(querySelect, + (clientTour, tours) => + { + if (!clientTourDict.TryGetValue(clientTour.Id, out var ct)) + { + ct = []; + clientTourDict.Add(clientTour.Id, ct); + } + ct.Add(tours); + return clientTour; + }, splitOn: "ClientId",param: new {dateFrom, dateTo, tourId, clientId}); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(tours)); + + return clientTourDict.Select(x => + { + var t = tours.First(y => y.Id == x.Key); + t.SetClientTours(x.Value); + return t; + }).ToArray(); } catch (Exception ex) { diff --git a/project/ProjectTourAgency/Reports/ChartReport.cs b/project/ProjectTourAgency/Reports/ChartReport.cs index ac2b5d2..1b890cc 100644 --- a/project/ProjectTourAgency/Reports/ChartReport.cs +++ b/project/ProjectTourAgency/Reports/ChartReport.cs @@ -28,7 +28,7 @@ internal class ChartReport { new PdfBuilder(filePath) .AddHeader("Операции пополнения") - .AddPieChart("Пополнения счетов клиентов", GetData(dateTime)) + .AddPieChart($"Пополнения счетов клиентов за {dateTime.ToString("d MMMM yyyy")}", GetData(dateTime)) .Build(); return true; @@ -43,9 +43,8 @@ internal class ChartReport private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _addMoneyRepository - .ReadAddMoneys() - .Where(x => x.Date.Date == dateTime.Date) - .GroupBy(x => x.ClientId, (key, group) => new { Id = key, Count = group.Count() }) + .ReadAddMoneys(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) + .GroupBy(x => x.ClientName, (key, group) => new { Id = key, Count = group.Count() }) .Select(x => (x.Id.ToString(), (double)x.Count)) .ToList(); } diff --git a/project/ProjectTourAgency/Reports/TableReportcs.cs b/project/ProjectTourAgency/Reports/TableReportcs.cs index c388620..5200dd1 100644 --- a/project/ProjectTourAgency/Reports/TableReportcs.cs +++ b/project/ProjectTourAgency/Reports/TableReportcs.cs @@ -31,7 +31,7 @@ namespace ProjectTourAgency.Reports { new ExcelBuilder(filePath) .AddHeader("Сводка по движению корма", 0, 4) - .AddParagraph("за период", 0) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) .AddTable(new[] { 10, 10, 15, 15 }, GetData(tourId, startDate, endDate)) .Build(); return true; @@ -45,49 +45,55 @@ namespace ProjectTourAgency.Reports private List GetData(int tourId, DateTime startDate, DateTime endDate) { - - var tourData = _tourRepository.ReadTours() - .Where(x => x.DepartureDate >= startDate && x.DepartureDate <= endDate && x.ClientTours.Any(y => y.TourId == tourId)) + var tourData = _tourRepository.ReadTours(startDate, endDate, tourId) .SelectMany(x => x.ClientTours - .Where(y => y.TourId == tourId) .Select(y => new { - ClientId = (int?)y.ClientId, + ClientId = y.ClientId, + ClientName = y.CLientName, Date = x.DepartureDate, CountIn = (int?)null, CountOut = (int?)y.Cost })); - - var clientIds = tourData.Select(x => x.ClientId).Distinct().ToList(); + var clientId = tourData.Select(x => x.ClientId).Distinct().ToList(); - - var addMoneyData = _addMoneyRepository.ReadAddMoneys() - .Where(x => x.Date >= startDate && x.Date <= endDate && clientIds.Contains(x.ClientId)) + var addMoneyData = _addMoneyRepository.ReadAddMoneys(startDate, endDate) + .Where(x => clientId.Contains(x.ClientId)) .Select(x => new { - ClientId = (int?)x.ClientId, + ClientId = x.ClientId, + ClientName = x.ClientName, Date = x.Date, CountIn = (int?)x.MoneyAmount, CountOut = (int?)null }); - + // Объединяем данные и группируем по клиенту и дате var data = tourData .Union(addMoneyData) + .GroupBy(x => new { x.ClientId, x.ClientName, x.Date }) + .Select(g => new { + ClientName = g.Key.ClientName, + Date = g.Key.Date, + CountIn = g.Sum(x => x.CountIn ?? 0), + CountOut = g.Sum(x => x.CountOut ?? 0) + }) .OrderBy(x => x.Date); return new List() { item } .Union(data.Select(x => new string[] { - x.ClientId.ToString(), - x.Date.ToString(), - x.CountIn?.ToString() ?? string.Empty, - x.CountOut?.ToString() ?? string.Empty })) + x.ClientName, + x.Date.ToString("dd.MM.yyyy"), // Форматируем дату + x.CountIn == 0 ? "NO" : x.CountIn.ToString(), + x.CountOut == 0 ? "NO" : x.CountOut.ToString() + })) .Union(new[] { new string[] { - "Всего", - "", - data.Sum(x => x.CountIn ?? 0).ToString(), - data.Sum(x => x.CountOut ?? 0).ToString() - }}) + "Всего", + "", + data.Sum(x => x.CountIn) == 0 ? "NO" : data.Sum(x => x.CountIn).ToString(), + data.Sum(x => x.CountOut) == 0 ? "NO" : data.Sum(x => x.CountOut).ToString() + }}) .ToList(); } + } } diff --git a/project/ProjectTourAgency/Repositories/IAddMoneyRepository.cs b/project/ProjectTourAgency/Repositories/IAddMoneyRepository.cs index 9f8e7b6..8d64a5b 100644 --- a/project/ProjectTourAgency/Repositories/IAddMoneyRepository.cs +++ b/project/ProjectTourAgency/Repositories/IAddMoneyRepository.cs @@ -9,7 +9,7 @@ namespace ProjectTourAgency.Repositories; public interface IAddMoneyRepository { - IEnumerable ReadAddMoneys(); + IEnumerable ReadAddMoneys(DateTime? dateFrom = null, DateTime? dateTo = null, int? addMoneyId = null, int? clientId = null); AddMoney ReadAddMoneyById(int id); diff --git a/project/ProjectTourAgency/Repositories/ITourRepositiry.cs b/project/ProjectTourAgency/Repositories/ITourRepositiry.cs index 60d519e..5207e79 100644 --- a/project/ProjectTourAgency/Repositories/ITourRepositiry.cs +++ b/project/ProjectTourAgency/Repositories/ITourRepositiry.cs @@ -9,7 +9,7 @@ namespace ProjectTourAgency.Repositories; public interface ITourRepository { - IEnumerable ReadTours(); + IEnumerable ReadTours(DateTime? dateFrom = null, DateTime? dateTo = null, int? tourId = null, int? clientId = null); void CreateTour(Tour tour);