@page "/einkauf/verbindungen" @using TrafagSalesExporter.Services @inject IPurchasingDataSourcePageService DataSourceService @inject TrafagSalesExporter.Services.IUiTextService UiText @inject ISnackbar Snackbar @T("Einkauf Datenquellen", "Purchasing data sources") @T("Einkauf Datenquellen", "Purchasing data sources") @T("Grafische SAP/OData-Anbindung fuer das Einkaufsdashboard, analog zur Finance-Quellenpflege.", "Graphical SAP/OData connection for the purchasing dashboard, following the finance source configuration pattern.") @if (_loading) { } else { @T("Verbindung", "Connection") @T("Speichern", "Save") @T("Verbindung testen", "Test connection") @T("Defaults wiederherstellen", "Restore defaults") @T("Aktuelle Basis", "Current basis")
@T("Zentrale URL", "Central URL"): @Display(_state.SourceSystem?.CentralServiceUrl)
@T("Quellen", "Sources"): @_state.Sources.Count(x => x.IsActive)
@T("Joins", "Joins"): @_state.Joins.Count(x => x.IsActive)
@T("Mappings", "Mappings"): @_state.Mappings.Count(x => x.IsActive)
@T("OData Entity Sets", "OData entity sets") @T("Quelle", "Source") Alias Entity Set @T("Primaer", "Primary") @T("Aktiv", "Active") @foreach (var join in _state.Joins.Where(x => x.IsActive)) { @join.LeftAlias -> @join.RightAlias @join.LeftKeys = @join.RightKeys } @T("Joins", "Joins") @T("Join", "Join") @T("Links", "Left") Left Keys @T("Rechts", "Right") Right Keys @T("Typ", "Type") @T("Aktiv", "Active") @T("Zielfelder", "Target fields") @T("Mapping", "Mapping") @T("Ziel", "Target") @T("Quelle", "Source") @T("Pflicht", "Required") @T("Aktiv", "Active") } @code { private PurchasingDataSourceState _state = new(); private bool _loading = true; private bool _busy; protected override async Task OnInitializedAsync() { _state = await DataSourceService.LoadAsync(); _loading = false; } private async Task SaveAsync() { await RunAsync(async () => { _state = await DataSourceService.SaveAsync(_state); Snackbar.Add(T("Einkaufsdatenquellen gespeichert.", "Purchasing data sources saved."), Severity.Success); }); } private async Task ResetDefaultsAsync() { await RunAsync(async () => { _state = await DataSourceService.ResetDefaultsAsync(); Snackbar.Add(T("Einkaufsdatenquellen auf Defaults gesetzt.", "Purchasing data sources restored to defaults."), Severity.Info); }); } private async Task TestConnectionAsync() { await RunAsync(async () => { var result = await DataSourceService.TestConnectionAsync(_state); Snackbar.Add(TranslateConnectionMessage(result.Message), result.Success ? Severity.Success : result.Warning ? Severity.Warning : Severity.Error); }); } private async Task RunAsync(Func action) { if (_busy) return; _busy = true; try { await action(); } catch (Exception ex) { Snackbar.Add(ex.Message, Severity.Error); } finally { _busy = false; } } private void AddSource() => _state.Sources.Add(new SapSourceDefinition { Alias = "NEW", EntitySet = "NewEntitySet", IsActive = true, SortOrder = (_state.Sources.Count + 1) * 10 }); private void AddJoin() => _state.Joins.Add(new SapJoinDefinition { LeftAlias = "EKKO", RightAlias = "NEW", LeftKeys = "Key", RightKeys = "Key", JoinType = "Left", IsActive = true, SortOrder = (_state.Joins.Count + 1) * 10 }); private void AddMapping() => _state.Mappings.Add(new SapFieldMapping { TargetField = "NewField", SourceExpression = "Alias.Field", IsActive = true, SortOrder = (_state.Mappings.Count + 1) * 10 }); private void RemoveSource(SapSourceDefinition source) => _state.Sources.Remove(source); private void RemoveJoin(SapJoinDefinition join) => _state.Joins.Remove(join); private void RemoveMapping(SapFieldMapping mapping) => _state.Mappings.Remove(mapping); private string T(string german, string english) => UiText.Text(german, english); private static string Display(string? value) => string.IsNullOrWhiteSpace(value) ? "-" : value; private string TranslateConnectionMessage(string message) { if (string.IsNullOrWhiteSpace(message)) return string.Empty; if (message.Contains("Keine SAP Service URL gepflegt", StringComparison.OrdinalIgnoreCase)) return T("Keine SAP Service URL gepflegt.", "No SAP service URL maintained."); if (message.Contains("Keine SAP Gateway Zugangsdaten gepflegt", StringComparison.OrdinalIgnoreCase)) return T("Keine SAP Gateway Zugangsdaten gepflegt.", "No SAP Gateway credentials maintained."); if (message.Contains("SAP OData Verbindung erfolgreich", StringComparison.OrdinalIgnoreCase)) return T("SAP OData Verbindung erfolgreich.", "SAP OData connection successful."); if (message.StartsWith("SAP OData Verbindung fehlgeschlagen", StringComparison.OrdinalIgnoreCase)) return message.Replace("SAP OData Verbindung fehlgeschlagen", T("SAP OData Verbindung fehlgeschlagen", "SAP OData connection failed"), StringComparison.OrdinalIgnoreCase); return message; } }