From f467ebb99ecab4933ab355f0e1213d9d07d22331 Mon Sep 17 00:00:00 2001 From: troogs Date: Tue, 17 Feb 2026 10:38:49 +0100 Subject: [PATCH] Add GetRosinenStoreMemberReportAsync method and update Program menu --- Cli/CustomTasks.cs | 62 +++++++++++++++++++++++++++++++++++++++++ Cli/Program.cs | 4 +++ Cli/Tasks/StoreTasks.cs | 2 +- 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Cli/CustomTasks.cs b/Cli/CustomTasks.cs index 8de19e9..233ec55 100644 --- a/Cli/CustomTasks.cs +++ b/Cli/CustomTasks.cs @@ -309,5 +309,67 @@ namespace FsToolbox.Cli } #endregion + + #region Public Method GetRosinenStoreMemberReportAsync + + /// + /// Generates a report with all members for each configured Rosinen store. + /// + /// The HTTP client used to perform the requests. + public static async Task GetRosinenStoreMemberReportAsync(HttpClient httpClient) + { + await AuthHelper.EnsureAuthenticationAsync(httpClient); + + var storeIds = SettingsProvider.Current.CustomTasks.RosinenStoreMemberReport.StoreIds; + if (storeIds is not { Count: > 0 }) + { + Logger.Info("No store IDs configured. Please set CustomTasks.RosinenStoreMemberReport.StoreIds in appsettings.json."); + return; + } + + var report = new StringBuilder(); + report.AppendLine("Rosinen Store Member Report"); + report.AppendLine("Generated: " + DateTime.Now.ToString("dd.MM.yyyy HH:mm")); + report.AppendLine($"Configured stores: {storeIds.Count}"); + report.AppendLine("============================"); + report.AppendLine(); + + for (var index = 0; index < storeIds.Count; index++) + { + var storeId = storeIds[index]; + Logger.Info("Fetching details and members for store {StoreId} ({Current}/{Total})", storeId, index + 1, storeIds.Count); + + var storeDetails = await StoreTasks.GetStoreInformationAsync(httpClient, storeId); + await Task.Delay(200); + + var members = await StoreTasks.GetStoreMembersAsync(httpClient, storeId); + + var storeName = string.IsNullOrWhiteSpace(storeDetails?.Name) ? "Unknown Store" : storeDetails.Name; + report.AppendLine($"Store {storeName} ({storeId})"); + report.AppendLine("----------------------------"); + + if (members.Count == 0) + { + report.AppendLine("No members found."); + } + else + { + foreach (var member in members.OrderBy(x => x.Name, StringComparer.CurrentCultureIgnoreCase)) report.AppendLine($"- {member.Id} | {member.Name}"); + } + + report.AppendLine(); + + if (index < storeIds.Count - 1) + await Task.Delay(200); + } + + var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + var filename = $"RosinenStoreMembers_{timestamp}.txt"; + await File.WriteAllTextAsync(filename, report.ToString()); + + Logger.Info("Report saved: {FileName}", filename); + } + + #endregion } } \ No newline at end of file diff --git a/Cli/Program.cs b/Cli/Program.cs index 71f42f2..9abeb1e 100644 --- a/Cli/Program.cs +++ b/Cli/Program.cs @@ -20,6 +20,7 @@ logger.Info("1. Check Aldi Memberships"); logger.Info("2. Confirm all Unconfirmed Pickups for Lindenberg"); logger.Info("3. Analyze slot unregistrations for region Siegen"); logger.Info("4. Analyze early slot registrations (calendar interval)"); +logger.Info("5. Get rosinen-store member report"); logger.Info("Enter the number of the task to execute (or any other key to exit): "); var choice = Console.ReadLine(); @@ -37,6 +38,9 @@ switch (choice) case "4": await CustomTasks.AnalyzeEarlySlotRegistrationsAsync(httpClient); break; + case "5": + await CustomTasks.GetRosinenStoreMemberReportAsync(httpClient); + break; default: logger.Info("Exiting..."); break; diff --git a/Cli/Tasks/StoreTasks.cs b/Cli/Tasks/StoreTasks.cs index 2c976cc..39285e6 100644 --- a/Cli/Tasks/StoreTasks.cs +++ b/Cli/Tasks/StoreTasks.cs @@ -94,7 +94,7 @@ namespace FsToolbox.Cli.Tasks { await AuthHelper.EnsureAuthenticationAsync(httpClient); - var uri = string.Format(Endpoints.StoreInformation, storeId); + var uri = string.Format(Endpoints.StoreDetails, storeId); var response = await httpClient.GetAsync(uri); var responseBody = await response.Content.ReadAsStringAsync();