Clarify audit CSV settings section

This commit is contained in:
2026-06-11 09:28:10 +02:00
parent 0cecb1eddf
commit 2e7aeda684
3 changed files with 64 additions and 22 deletions
@@ -284,18 +284,6 @@
Schreibt zusätzliche technische Fortschrittsmeldungen für HANA- und SAP-Lesevorgänge ins Dashboard und in die Logs. Schreibt zusätzliche technische Fortschrittsmeldungen für HANA- und SAP-Lesevorgänge ins Dashboard und in die Logs.
</MudText> </MudText>
</MudItem> </MudItem>
<MudItem xs="12" md="4">
<MudSwitch @bind-Value="_exportSettings.AuditCsvEnabled" Label="Audit-CSV je Standort schreiben" Color="Color.Primary" />
<MudText Typo="Typo.caption">
Schreibt nach Mapping und Transformation eine lesbare CSV-Datei je Standort.
</MudText>
</MudItem>
<MudItem xs="12" md="4">
<MudSwitch @bind-Value="_exportSettings.UseAuditCsvAsCentralSource" Label="Zentrale Auswertung aus Audit-CSV" Color="Color.Warning" />
<MudText Typo="Typo.caption">
Zentrale Excel, Finance Summary und Management-Analyse lesen die neuesten Standort-CSV-Dateien statt CentralSalesRecords.
</MudText>
</MudItem>
<MudItem xs="12" md="6"> <MudItem xs="12" md="6">
<MudTextField @bind-Value="_exportSettings.LocalSiteExportFolder" Label="Lokaler Standardpfad Standort-Dateien" <MudTextField @bind-Value="_exportSettings.LocalSiteExportFolder" Label="Lokaler Standardpfad Standort-Dateien"
HelperText="Wenn leer, wird ./output unter dem Programmverzeichnis verwendet." /> HelperText="Wenn leer, wird ./output unter dem Programmverzeichnis verwendet." />
@@ -304,9 +292,38 @@
<MudTextField @bind-Value="_exportSettings.LocalConsolidatedExportFolder" Label="Lokaler Pfad Zentrale Datei" <MudTextField @bind-Value="_exportSettings.LocalConsolidatedExportFolder" Label="Lokaler Pfad Zentrale Datei"
HelperText="Optional. Wenn leer, wird der Standardpfad der Standort-Dateien verwendet." /> HelperText="Optional. Wenn leer, wird der Standardpfad der Standort-Dateien verwendet." />
</MudItem> </MudItem>
<MudItem xs="12" md="6"> <MudItem xs="12">
<MudTextField @bind-Value="_exportSettings.LocalAuditCsvFolder" Label="Lokaler Pfad Audit-CSV" <div class="audit-csv-settings">
HelperText="Optional. Wenn leer, wird der Standardpfad der Standort-Dateien verwendet." /> <div class="audit-csv-header">
<MudIcon Icon="@Icons.Material.Filled.RuleFolder" Color="Color.Info" Size="Size.Medium" />
<div>
<MudText Typo="Typo.h6">Audit-CSV / nachvollziehbarer Datenfluss</MudText>
<MudText Typo="Typo.body2">
Fuer Finance und Wirtschaftspruefung: lesbare Standort-CSV nach Mapping und Konvertierung, optional als Quelle fuer zentrale Auswertungen.
</MudText>
</div>
</div>
<MudGrid Spacing="2">
<MudItem xs="12" md="4">
<MudSwitch @bind-Value="_exportSettings.AuditCsvEnabled" Label="Audit-CSV je Standort schreiben" Color="Color.Primary" />
<MudText Typo="Typo.caption">
Schreibt beim Laenderexport je Standort eine Sales_*.csv mit den transformierten Daten.
</MudText>
</MudItem>
<MudItem xs="12" md="4">
<MudSwitch @bind-Value="_exportSettings.UseAuditCsvAsCentralSource" Label="Zentrale Auswertung aus Audit-CSV" Color="Color.Warning" />
<MudText Typo="Typo.caption">
Dashboard, zentrale Excel-Datei und Finance-Auswertungen lesen die neuesten Standort-CSV-Dateien statt CentralSalesRecords.
</MudText>
</MudItem>
<MudItem xs="12" md="4">
<MudAlert Severity="Severity.Info" Dense="true" Variant="Variant.Filled">
Audit-CSV wird immer im gleichen Ordner wie die lokalen Standort-Dateien abgelegt.
Der Pfad wird oben bei <b>Lokaler Standardpfad Standort-Dateien</b> gesetzt.
</MudAlert>
</MudItem>
</MudGrid>
</div>
</MudItem> </MudItem>
<MudItem xs="12"> <MudItem xs="12">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="SaveExportSettings" <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="SaveExportSettings"
@@ -329,6 +346,23 @@
</MudText> </MudText>
</MudPaper> </MudPaper>
<style>
.audit-csv-settings {
background: #e8f3ff;
border: 1px solid #90caf9;
border-left: 6px solid #1976d2;
border-radius: 8px;
padding: 18px 20px;
}
.audit-csv-header {
display: flex;
align-items: flex-start;
gap: 12px;
margin-bottom: 14px;
}
</style>
@code { @code {
private SharePointConfig _spConfig = new(); private SharePointConfig _spConfig = new();
private ExportSettings _exportSettings = new(); private ExportSettings _exportSettings = new();
@@ -123,13 +123,13 @@ public sealed class ExportAuditCsvService : IExportAuditCsvService
public string ResolveAuditCsvDirectory(ExportSettings settings, string? fallbackOutputDirectory = null) public string ResolveAuditCsvDirectory(ExportSettings settings, string? fallbackOutputDirectory = null)
{ {
if (!string.IsNullOrWhiteSpace(settings.LocalAuditCsvFolder)) if (!string.IsNullOrWhiteSpace(fallbackOutputDirectory))
return settings.LocalAuditCsvFolder.Trim(); return fallbackOutputDirectory.Trim();
if (!string.IsNullOrWhiteSpace(settings.LocalSiteExportFolder)) if (!string.IsNullOrWhiteSpace(settings.LocalSiteExportFolder))
return Path.Combine(settings.LocalSiteExportFolder.Trim(), "audit-csv"); return settings.LocalSiteExportFolder.Trim();
return Path.Combine(AppContext.BaseDirectory, "output", "audit-csv"); return Path.Combine(AppContext.BaseDirectory, "output");
} }
private static IEnumerable<string> BuildRow(Site site, string sourceSystem, SalesRecord record) private static IEnumerable<string> BuildRow(Site site, string sourceSystem, SalesRecord record)
@@ -29,7 +29,8 @@ public sealed class ExportAuditCsvServiceTests : IDisposable
var settings = new ExportSettings var settings = new ExportSettings
{ {
AuditCsvEnabled = true, AuditCsvEnabled = true,
LocalAuditCsvFolder = _tempDirectory LocalSiteExportFolder = _tempDirectory,
LocalAuditCsvFolder = Path.Combine(_tempDirectory, "ignored")
}; };
var site = new Site { TSC = "TRCH", Land = "Schweiz" }; var site = new Site { TSC = "TRCH", Land = "Schweiz" };
var record = new SalesRecord var record = new SalesRecord
@@ -65,6 +66,7 @@ public sealed class ExportAuditCsvServiceTests : IDisposable
var path = await service.WriteSiteAuditCsvAsync(site, settings, "SAP", _tempDirectory, [record]); var path = await service.WriteSiteAuditCsvAsync(site, settings, "SAP", _tempDirectory, [record]);
Assert.True(File.Exists(path)); Assert.True(File.Exists(path));
Assert.Equal(_tempDirectory, Path.GetDirectoryName(path));
var records = await service.ReadLatestSiteAuditCsvRecordsAsync(settings); var records = await service.ReadLatestSiteAuditCsvRecordsAsync(settings);
var roundtrip = Assert.Single(records); var roundtrip = Assert.Single(records);
Assert.Equal("SAP", roundtrip.SourceSystem); Assert.Equal("SAP", roundtrip.SourceSystem);
@@ -84,7 +86,12 @@ public sealed class ExportAuditCsvServiceTests : IDisposable
var csvService = new ExportAuditCsvService(); var csvService = new ExportAuditCsvService();
await csvService.WriteSiteAuditCsvAsync( await csvService.WriteSiteAuditCsvAsync(
new Site { TSC = "TRUK", Land = "England" }, new Site { TSC = "TRUK", Land = "England" },
new ExportSettings { AuditCsvEnabled = true, LocalAuditCsvFolder = _tempDirectory }, new ExportSettings
{
AuditCsvEnabled = true,
LocalSiteExportFolder = _tempDirectory,
LocalAuditCsvFolder = Path.Combine(_tempDirectory, "ignored")
},
"MANUAL_EXCEL", "MANUAL_EXCEL",
_tempDirectory, _tempDirectory,
[ [
@@ -112,7 +119,8 @@ public sealed class ExportAuditCsvServiceTests : IDisposable
db.ExportSettings.Add(new ExportSettings db.ExportSettings.Add(new ExportSettings
{ {
UseAuditCsvAsCentralSource = true, UseAuditCsvAsCentralSource = true,
LocalAuditCsvFolder = _tempDirectory LocalSiteExportFolder = _tempDirectory,
LocalAuditCsvFolder = Path.Combine(_tempDirectory, "ignored")
}); });
db.Sites.Add(new Site db.Sites.Add(new Site
{ {