diff --git a/C969Project/ReportsForm.Designer.cs b/C969Project/ReportsForm.Designer.cs index 38972aa..ae34814 100644 --- a/C969Project/ReportsForm.Designer.cs +++ b/C969Project/ReportsForm.Designer.cs @@ -39,19 +39,23 @@ partial class ReportsForm userScheduleDataGrid = new System.Windows.Forms.DataGridView(); userComboBox = new System.Windows.Forms.ComboBox(); refreshButton2 = new System.Windows.Forms.Button(); - customersByCountryTabPage = new System.Windows.Forms.TabPage(); + customersByCityTabPage = new System.Windows.Forms.TabPage(); + refreshButton3 = new System.Windows.Forms.Button(); + customersByCityDataGrid = new System.Windows.Forms.DataGridView(); tabControl1.SuspendLayout(); apptByMothTabPage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)apptByMonthDataGrid).BeginInit(); userSchedulesTabPage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)userScheduleDataGrid).BeginInit(); + customersByCityTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)customersByCityDataGrid).BeginInit(); SuspendLayout(); // // tabControl1 // tabControl1.Controls.Add(apptByMothTabPage); tabControl1.Controls.Add(userSchedulesTabPage); - tabControl1.Controls.Add(customersByCountryTabPage); + tabControl1.Controls.Add(customersByCityTabPage); tabControl1.Location = new System.Drawing.Point(12, 12); tabControl1.Name = "tabControl1"; tabControl1.SelectedIndex = 0; @@ -124,14 +128,33 @@ partial class ReportsForm refreshButton2.Text = "Refresh"; refreshButton2.UseVisualStyleBackColor = true; // - // customersByCountryTabPage + // customersByCityTabPage // - customersByCountryTabPage.Location = new System.Drawing.Point(4, 24); - customersByCountryTabPage.Name = "customersByCountryTabPage"; - customersByCountryTabPage.Size = new System.Drawing.Size(768, 398); - customersByCountryTabPage.TabIndex = 2; - customersByCountryTabPage.Text = "Customers By Country"; - customersByCountryTabPage.UseVisualStyleBackColor = true; + customersByCityTabPage.Controls.Add(refreshButton3); + customersByCityTabPage.Controls.Add(customersByCityDataGrid); + customersByCityTabPage.Location = new System.Drawing.Point(4, 24); + customersByCityTabPage.Name = "customersByCityTabPage"; + customersByCityTabPage.Size = new System.Drawing.Size(768, 398); + customersByCityTabPage.TabIndex = 2; + customersByCityTabPage.Text = "Customers By City"; + customersByCityTabPage.UseVisualStyleBackColor = true; + // + // refreshButton3 + // + refreshButton3.Location = new System.Drawing.Point(675, 372); + refreshButton3.Name = "refreshButton3"; + refreshButton3.Size = new System.Drawing.Size(90, 23); + refreshButton3.TabIndex = 3; + refreshButton3.Text = "Refresh"; + refreshButton3.UseVisualStyleBackColor = true; + // + // customersByCityDataGrid + // + customersByCityDataGrid.Location = new System.Drawing.Point(3, 3); + customersByCityDataGrid.Name = "customersByCityDataGrid"; + customersByCityDataGrid.ReadOnly = true; + customersByCityDataGrid.Size = new System.Drawing.Size(762, 363); + customersByCityDataGrid.TabIndex = 2; // // ReportsForm // @@ -145,9 +168,14 @@ partial class ReportsForm ((System.ComponentModel.ISupportInitialize)apptByMonthDataGrid).EndInit(); userSchedulesTabPage.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)userScheduleDataGrid).EndInit(); + customersByCityTabPage.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)customersByCityDataGrid).EndInit(); ResumeLayout(false); } + private System.Windows.Forms.DataGridView customersByCityDataGrid; + private System.Windows.Forms.Button refreshButton3; + private System.Windows.Forms.DataGridView userScheduleDataGrid; private System.Windows.Forms.ComboBox userComboBox; @@ -156,7 +184,7 @@ partial class ReportsForm private System.Windows.Forms.Button refreshButton1; - private System.Windows.Forms.TabPage customersByCountryTabPage; + private System.Windows.Forms.TabPage customersByCityTabPage; private System.Windows.Forms.DataGridView apptByMonthDataGrid; private System.Windows.Forms.TabControl tabControl1; diff --git a/C969Project/ReportsForm.cs b/C969Project/ReportsForm.cs index 81268b0..d48f48d 100644 --- a/C969Project/ReportsForm.cs +++ b/C969Project/ReportsForm.cs @@ -25,12 +25,15 @@ public partial class ReportsForm : Form UserSchedule_UpdateUsers(); userComboBox.SelectedIndexChanged += (sender, args) => { UserSchedule_GenerateReport(); }; - userComboBox.SelectedIndex = -1; // Reset selection + userComboBox.SelectedIndex = -1; refreshButton2.Click += (sender, args) => { UserSchedule_UpdateUsers(); UserSchedule_GenerateReport(); }; + + CustomersByCity_GenerateReport(); + refreshButton3.Click += (sender, args) => { CustomersByCity_GenerateReport(); }; } #region Apptointments types by Month @@ -130,4 +133,40 @@ public partial class ReportsForm : Form } #endregion + + #region Number of Users by City + + private void CustomersByCity_GenerateReport() + { + customersByCityDataGrid.DataSource = null; + + var customers = DatabaseHelper.RetrieveCustomers(); + var cityCounts = customers + .Select(c => + { + var addr = DatabaseHelper.RetrieveAddress(c.AddressId); + var city = addr != null ? DatabaseHelper.RetrieveCity(addr.CityId) : null; + return city?.CityName; + }) + .Where(cityName => !string.IsNullOrEmpty(cityName)) + .GroupBy(cityName => cityName) + .Select(g => new CustomersByCity(g.Key, g.Count())) + .ToList(); + + customersByCityDataGrid.DataSource = cityCounts; + } + + private class CustomersByCity + { + public string? City { get; set; } + public int UserCount { get; set; } + + public CustomersByCity(string? city, int userCount) + { + City = city; + UserCount = userCount; + } + } + + #endregion } \ No newline at end of file diff --git a/C969Project/todo.md b/C969Project/todo.md index 1d22ba2..774b16a 100644 --- a/C969Project/todo.md +++ b/C969Project/todo.md @@ -63,10 +63,10 @@ ## 7. Reports -- [ ] Create a report generator using collection classes and lambda expressions: - - [ ] Report: Number of appointment types by month - - [ ] Report: Schedule for each user - - [ ] Report: One additional report of your choice +- [x] Create a report generator using collection classes and lambda expressions: + - [x] Report: Number of appointment types by month + - [x] Report: Schedule for each user + - [x] Report: One additional report of your choice ## 8. Login History