'settings'])); exit; } $notificationEmail = trim((string)($_POST['notification_email'] ?? '')); if (!filter_var($notificationEmail, FILTER_VALIDATE_EMAIL)) { diagnostic_flash_set('danger', 'Podaj poprawny adres e-mail administratora do powiadomień o nowych prośbach o kontakt.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } diagnostic_admin_setting_set('admin_notification_email', $notificationEmail); diagnostic_flash_set('success', 'Adres e-mail administratora do powiadomień został zapisany.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } if ($action === 'save-openai-api-key') { if (!diagnostic_admin_is_authenticated()) { diagnostic_flash_set('warning', 'Zaloguj się jako administrator, aby zapisać klucz OpenAI.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } $openAiApiKey = preg_replace('/\s+/', '', (string)($_POST['openai_api_key'] ?? '')) ?? ''; if (!diagnostic_openai_api_key_is_valid($openAiApiKey)) { diagnostic_flash_set('danger', 'Podaj poprawny klucz API OpenAI. Klucz powinien być kompletny i bez spacji.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } diagnostic_admin_setting_set('openai_api_key', $openAiApiKey); diagnostic_flash_set('success', 'Własny klucz API OpenAI został zapisany. Nowe zapytania AI będą używały tego klucza.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } if ($action === 'remove-openai-api-key') { if (!diagnostic_admin_is_authenticated()) { diagnostic_flash_set('warning', 'Zaloguj się jako administrator, aby usunąć klucz OpenAI.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } diagnostic_admin_setting_set('openai_api_key', null); diagnostic_flash_set('info', 'Zapisany klucz API OpenAI został usunięty. System wrócił do domyślnej konfiguracji proxy.'); header('Location: ' . diagnostic_admin_path(['tab' => 'settings'])); exit; } if ($action === 'resend-report') { if (!diagnostic_admin_is_authenticated()) { diagnostic_flash_set('warning', 'Zaloguj się jako administrator, aby ponownie wysłać raport.'); header('Location: ' . diagnostic_admin_path()); exit; } $attemptId = (int)($_POST['attempt_id'] ?? 0); if ($attemptId <= 0) { diagnostic_flash_set('danger', 'Nie udało się ustalić, dla której próby należy ponownie wysłać raport.'); header('Location: ' . diagnostic_admin_path()); exit; } $result = diagnostic_admin_resend_report($attemptId); if (!empty($result['success'])) { $attempt = diagnostic_get_attempt($attemptId); $recipient = $attempt['email'] ?? ''; diagnostic_flash_set('success', 'Raport został wysłany ponownie do klienta' . ($recipient !== '' ? ' (' . $recipient . ')' : '') . '.'); } else { diagnostic_flash_set('danger', 'Nie udało się ponownie wysłać raportu: ' . (string)($result['error'] ?? 'Nieznany błąd.')); } header('Location: ' . diagnostic_admin_path(['attempt' => $attemptId])); exit; } } if (diagnostic_admin_is_authenticated() && ($_GET['export'] ?? '') === 'csv') { header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="wyniki-diagnozy-' . date('Ymd-His') . '.csv"'); echo diagnostic_admin_export_csv(); exit; } $flash = diagnostic_flash_get(); $meta = diagnostic_meta('Panel administratora', 'Zabezpieczony panel do przeglądu prób diagnozy i wyników dojrzałości procesowej.'); $definition = diagnostic_quiz_definition(); $attempts = diagnostic_admin_is_authenticated() ? diagnostic_admin_attempts() : []; $stats = diagnostic_admin_is_authenticated() ? diagnostic_admin_stats() : []; $selectedAttempt = null; if (diagnostic_admin_is_authenticated() && isset($_GET['attempt'])) { $selectedAttempt = diagnostic_get_attempt((int)$_GET['attempt']); } if (!$selectedAttempt && !empty($attempts)) { $selectedAttempt = diagnostic_get_attempt((int)$attempts[0]['id']); } $questionMap = diagnostic_question_map(); $credentials = diagnostic_admin_credentials(); $notificationConfig = diagnostic_admin_is_authenticated() ? diagnostic_admin_notification_config() : ['configured_email' => '', 'fallback_email' => '', 'effective_email' => '', 'source' => 'none']; $openAiConfig = diagnostic_admin_is_authenticated() ? diagnostic_admin_openai_key_config() : ['configured' => false, 'masked_key' => '']; $currentTab = 'overview'; if (diagnostic_admin_is_authenticated()) { $requestedTab = (string)($_GET['tab'] ?? 'overview'); $currentTab = in_array($requestedTab, ['overview', 'settings'], true) ? $requestedTab : 'overview'; } ?> <?= htmlspecialchars($meta['title']) ?>
Strefa zabezpieczona

Logowanie administratora

Panel służy do przeglądu prób, analizy wyników oraz eksportu danych z diagnozy dojrzałości procesowej.

Panel administratora

Operacje i wyniki diagnozy

Przeglądaj próby respondentów, śledź skuteczność ukończenia i analizuj wyniki w poszczególnych obszarach.

Eksportuj CSV
Wszystkie próby
Ukończone
%Wskaźnik ukończenia
%Średni wynik
Nawigacja panelu

Wybierz obszar pracy

Ustawienia wrażliwe zostały przeniesione do osobnej zakładki, aby nie były widoczne od razu po wejściu do panelu.

Powiadomienia o konsultacji

Adres administratora dla nowych numerów telefonu

Gdy użytkownik poda numer telefonu po ukończeniu diagnozy, system wyśle powiadomienie e-mail właśnie na ten adres.

Aktywna konfiguracja Powiadomienia trafiają na: Źródło: ustawienie zapisane w panelu administracyjnym. Powiadomienia tymczasowo trafią na: To fallback testowy z MAIL_TO. Ustaw adres w panelu, aby zarządzać nim bez edycji środowiska. Brak ustawionego adresu do powiadomień. Do czasu zapisania adresu w panelu e-mail o nowej prośbie o kontakt nie zostanie wysłany.
Integracja AI

Własny klucz API OpenAI

Zapisany tutaj klucz będzie automatycznie używany przez wszystkie obecne wywołania AI w aplikacji: diagnozę, czat i webhook Telegrama.

Pole pozostaje puste po zapisaniu ze względów bezpieczeństwa. Wprowadź nowy klucz tylko wtedy, gdy chcesz go zmienić.
Aktywna konfiguracja Zapytania AI używają własnego klucza zapisanego w panelu. Zapisany klucz: Klucz jest wysyłany centralnie przez LocalAIApi, więc nie trzeba osobno zmieniać endpointów. Brak własnego klucza OpenAI w panelu. Do czasu zapisania klucza aplikacja korzysta z domyślnej konfiguracji proxy.
Lista prób

Ostatnie odpowiedzi

rekordów

Brak zapisanych prób

Po pierwszym wypełnieniu diagnozy przez użytkownika wyniki pojawią się tutaj automatycznie.

ID E-mail Status Telefon Wynik Segment Raport Szczegóły
# Zobacz

Brak wybranej próby

Wybierz odpowiedź z listy, aby zobaczyć szczegóły, rozkład sekcji i pełny zestaw odpowiedzi.

Szczegóły próby #

Rozpoczęto:

Wynik
Status
Raport e-mail
Zgoda marketingowa
Telefon kontaktowy
Prośba o kontakt
Zakończono
Ponowna wysyłka raportu Wyślij ponownie raport na adres klienta:
Ponowna wysyłka będzie dostępna po ukończeniu diagnozy i wygenerowaniu wyniku. Ostatni błąd wysyłki:

Podsumowanie wyniku

%

Odpowiedzi respondenta

    $question): ?>
Zakres diagnozy

Obszary oceniane w narzędziu

pytań w tej sekcji.