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();