diff --git a/admin-vr0heltmao.php b/admin-vr0heltmao.php new file mode 100644 index 0000000..b95c849 --- /dev/null +++ b/admin-vr0heltmao.php @@ -0,0 +1,489 @@ + '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.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDE-mailStatusTelefonWynikSegmentRaportSzczegół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. +
+
+ +
+
+ + +
+
+ + + + + + + diff --git a/admin.php b/admin.php index d5e50d1..1a67a87 100644 --- a/admin.php +++ b/admin.php @@ -2,132 +2,8 @@ declare(strict_types=1); require_once __DIR__ . '/app/bootstrap.php'; -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $action = $_POST['action'] ?? ''; - if ($action === 'login') { - $username = trim((string)($_POST['username'] ?? '')); - $password = (string)($_POST['password'] ?? ''); - if (diagnostic_admin_login($username, $password)) { - diagnostic_flash_set('success', 'Sesja administratora została rozpoczęta.'); - header('Location: /admin.php'); - exit; - } - diagnostic_flash_set('danger', 'Nieprawidłowy login lub hasło administratora.'); - header('Location: /admin.php'); - exit; - } - if ($action === 'logout') { - diagnostic_admin_logout(); - diagnostic_flash_set('info', 'Sesja administratora została zakończona.'); - header('Location: /admin.php'); - exit; - } - if ($action === 'save-notification-email') { - if (!diagnostic_admin_is_authenticated()) { - diagnostic_flash_set('warning', 'Zaloguj się jako administrator, aby zmienić adres powiadomień.'); - header('Location: /admin.php?tab=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: /admin.php?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: /admin.php?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: /admin.php?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: /admin.php?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: /admin.php?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: /admin.php?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: /admin.php?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: /admin.php'); - 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: /admin.php'); - 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: /admin.php?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'; -} +http_response_code(404); +$meta = diagnostic_meta('Nie znaleziono strony', 'Ten adres panelu administracyjnego nie jest aktywny.'); ?> @@ -136,353 +12,31 @@ if (diagnostic_admin_is_authenticated()) { <?= htmlspecialchars($meta['title']) ?> - - - - - - - - -