@page "/hr-kpi" @using Microsoft.Extensions.Options @using TrafagSalesExporter.Components.HrKpi @using TrafagSalesExporter.Services @inject IHrKpiService HrKpiService @inject IOptions DataSourceOptions @inject IHrKpiAccessService HrKpiAccess @inject ISnackbar Snackbar @inject IUiTextService UiText @inject IJSRuntime JsRuntime @T("HR KPI", "HR KPI") @T("HR KPI", "HR KPI") @if (!CanShowHrKpi) { @T("HR KPI enthaelt sensible Personaldaten. Bitte separat anmelden.", "HR KPI contains sensitive HR data. Please sign in separately.") @if (!HrKpiAccess.IsConfigured) { @T("HR-KPI-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in HrKpiAccess konfigurieren.", "HR KPI access is not configured yet. Please configure Username and PasswordHash in HrKpiAccess.") } @T("HR KPI entsperren", "Unlock HR KPI") } else { @foreach (var option in _result?.ExitYearOptions ?? []) { @option } @foreach (var option in _result?.OrganisationOptions ?? []) { @option } @(_loading ? T("Lade...", "Loading...") : T("Laden", "Load")) @foreach (var option in _result?.EntryYearOptions ?? []) { @option } @foreach (var option in _result?.KostenstelleOptions ?? []) { @option } @foreach (var option in _result?.MitarbeitertypOptions ?? []) { @option } @foreach (var option in _fluktuationOptions) { @option.Label } @foreach (var option in _ampelOptions) { @option } @foreach (var option in _restferienOptions) { @option } @T("Sperren", "Lock") @T("Drucken/PDF", "Print/PDF") } @if (CanShowHrKpi && _result is not null) { @if (_result.Notices.Count > 0) { @foreach (var notice in _result.Notices) { @notice } } } @code { private string _dataFolder = HrKpiDataSourceOptions.DefaultFolder; private int? _year; private DateTime? _fromDate; private DateTime? _toDate; private int? _entryYear; private string? _organisation; private string? _kostenstelle; private string? _mitarbeitertyp; private string _fluktuationFilter = "Alle"; private string? _glzAmpel; private string? _restferienAmpel; private string? _searchText; private bool _managementView; private string? _hrUsername; private string? _hrPassword; private bool _loading; private HrKpiResult? _result; private readonly List<(string Key, string Label)> _fluktuationOptions = [ ("Alle", "Alle"), ("Fluktuationsrelevant", "Relevant"), ("Arbeitnehmerkuendigung", "Arbeitnehmerkuendigung"), ("Ausgeschlossen", "Ausgeschlossen") ]; private readonly List _ampelOptions = ["Gruen", "Gelb", "Rot"]; private readonly List _restferienOptions = ["Gruen", "Rot"]; protected override async Task OnInitializedAsync() { _dataFolder = DataSourceOptions.Value.Normalize().DataFolder; if (CanShowHrKpi) { await LoadAsync(); } } private async Task LoadAsync() { if (!CanShowHrKpi) { return; } _loading = true; try { _result = await HrKpiService.BuildAsync(new HrKpiOptions { DataFolder = _dataFolder, Year = _year, FromDate = _fromDate, ToDate = _toDate, EntryYear = _entryYear, Organisationseinheit = _organisation, KostenstelleText = _kostenstelle, Mitarbeitertyp = _mitarbeitertyp, FluktuationFilter = _fluktuationFilter, GlzAmpel = _glzAmpel, RestferienAmpel = _restferienAmpel, SearchText = _searchText, ManagementView = _managementView }); } catch (Exception ex) { Snackbar.Add(ex.Message, Severity.Error); } finally { _loading = false; } } private async Task UnlockHrKpiAsync() { if (!HrKpiAccess.TryUnlock(_hrUsername ?? string.Empty, _hrPassword ?? string.Empty)) { Snackbar.Add(T("HR-KPI-Anmeldung fehlgeschlagen.", "HR KPI sign-in failed."), Severity.Error); return; } _hrPassword = string.Empty; await LoadAsync(); } private void LockHrKpi() { HrKpiAccess.Lock(); _result = null; _hrPassword = string.Empty; } private async Task PrintAsync() { await JsRuntime.InvokeVoidAsync("print"); } private bool CanShowHrKpi => !HrKpiAccess.IsEnabled || HrKpiAccess.IsUnlocked; private string T(string german, string english) => UiText.Text(german, english); }