'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']) ?>
= htmlspecialchars($flash['message']) ?>
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.
Uwaga: aktywne są domyślne dane logowania administratora (admin / admin123). Przed użyciem produkcyjnym ustaw własne wartości DIAGNOSTIC_ADMIN_USER i DIAGNOSTIC_ADMIN_PASS.
Panel administratora
Operacje i wyniki diagnozy
Przeglądaj próby respondentów, śledź skuteczność ukończenia i analizuj wyniki w poszczególnych obszarach.
Gdy użytkownik poda numer telefonu po ukończeniu diagnozy, system wyśle powiadomienie e-mail właśnie na ten adres.
Aktywna konfiguracjaPowiadomienia trafiają na: = htmlspecialchars((string)$notificationConfig['effective_email']) ?>Źródło: ustawienie zapisane w panelu administracyjnym.Powiadomienia tymczasowo trafią na: = htmlspecialchars((string)$notificationConfig['effective_email']) ?>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.
Aktywna konfiguracjaZapytania AI używają własnego klucza zapisanego w panelu.Zapisany klucz: = htmlspecialchars((string)$openAiConfig['masked_key']) ?>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
= count($attempts) ?> rekordów
Brak zapisanych prób
Po pierwszym wypełnieniu diagnozy przez użytkownika wyniki pojawią się tutaj automatycznie.
Ponowna wysyłka raportuWyślij ponownie raport na adres klienta: = htmlspecialchars((string)$selectedAttempt['email']) ?>Ponowna wysyłka będzie dostępna po ukończeniu diagnozy i wygenerowaniu wyniku.Ostatni błąd wysyłki: = htmlspecialchars((string)$selectedAttempt['email_report_error']) ?>