@page "/import" @inject MeterVault.Infrastructure.Import.ReferenceDataImporter ReferenceImporter @inject MeterVault.Infrastructure.Import.CsvImporter CsvImporter @inject MeterVault.Infrastructure.Import.ImportService ImportService @inject Microsoft.EntityFrameworkCore.IDbContextFactory DbFactory @inject IDialogService Dialogs @inject ISnackbar Snackbar @using MeterVault.Infrastructure.Import @using MeterVault.Infrastructure.Persistence @using Microsoft.EntityFrameworkCore MeterVault — @S.Nav_Import @S.Nav_Import @S.Import_ReferenceDataset @S.Import_ReferenceDatasetHelp @(_referenceLoaded ? S.Import_ReferenceLoaded : S.Import_LoadReferenceData) @if (_loadingReference) { }
@S.Import_YourOwnCsv @S.Import_MappingWizard
@S.Import_YourOwnCsvHelp @S.Import_ProfileElectricity @S.Import_ProfileWater @S.Import_ProfileHeatingOil @S.Import_ProfileCosts @S.Import_DryRunReferenceSheet
@if (_preview is not null) { @S.Common_Preview
@S.Common_ReadingsLabel @_preview.Readings.Count @S.Common_EventsLabel @_preview.Events.Count @S.Common_ManualCostsLabel @_preview.ManualCosts.Count @S.Common_SkippedRowsLabel @_preview.SkippedRows
@if (_preview.Warnings.Count > 0) { @foreach (var warning in _preview.Warnings.Take(50)) { @warning.Display() } }
} @S.Import_RecentImports @if (_batches.Count == 0) { @S.Import_NoImportsYet } else { #@S.Import_ColumnSource@S.Import_ColumnRows@S.Import_ColumnImported@S.Common_Status @foreach (var batch in _batches) { @batch.Id @(batch.SourceName ?? "—") @batch.RowCount @batch.CreatedAt.LocalDateTime.ToString("yyyy-MM-dd HH:mm") @if (batch.RevertedAt is not null) { @S.Import_StatusReverted } else { @S.Import_StatusActive } @S.Import_Revert } }
@code { private bool _loadingReference; private bool _referenceLoaded; private string _profileName = "Strom"; private StagedImport? _preview; private List _batches = []; private int? _reverting; protected override async Task OnInitializedAsync() { _referenceLoaded = await ReferenceImporter.IsLoadedAsync(); await LoadBatchesAsync(); } private async Task LoadBatchesAsync() { await using var db = await DbFactory.CreateDbContextAsync(); _batches = await db.ImportBatches.AsNoTracking() .OrderByDescending(b => b.Id) .Take(25) .ToListAsync(); } private async Task RevertAsync(ImportBatch batch) { if (!await Confirm.ConfirmAsync(Dialogs, S.Import_RevertConfirmTitle, Loc.F(S.Import_RevertConfirmBody, batch.RowCount, batch.Id, batch.SourceName ?? S.Import_UnnamedSource), S.Import_Revert)) { return; } _reverting = batch.Id; try { await ImportService.RevertAsync(batch.Id); Snackbar.Add(Loc.F(S.Import_BatchReverted, batch.Id), Severity.Success); await LoadBatchesAsync(); } catch (Exception ex) { Snackbar.Add(Loc.F(S.Import_RevertFailed, ex.Message), Severity.Error); } finally { _reverting = null; } } private async Task LoadReferenceAsync() { _loadingReference = true; try { var dir = Path.Combine(AppContext.BaseDirectory, "sampledata"); await ReferenceImporter.LoadAsync(dir); _referenceLoaded = true; Snackbar.Add(S.Import_ReferenceDataLoaded, Severity.Success); await LoadBatchesAsync(); } catch (Exception ex) { Snackbar.Add(Loc.F(S.Import_Failed, ex.Message), Severity.Error); } finally { _loadingReference = false; } } private async Task PreviewAsync(InputFileChangeEventArgs args) { var file = args.File; if (file is null) { return; } var profile = SelectedProfile(); using var reader = new StreamReader(file.OpenReadStream(maxAllowedSize: 5 * 1024 * 1024)); var content = await reader.ReadToEndAsync(); using var stringReader = new StringReader(content); _preview = CsvImporter.Stage(profile, stringReader); } private MappingProfile SelectedProfile() => _profileName switch { "Wasser" => ReferenceProfiles.Water(), "Heizöl" => ReferenceProfiles.HeatingOil(), "Kosten" => ReferenceProfiles.Costs(), _ => ReferenceProfiles.Electricity(), }; }