questionnaireData = $questionnaireData; $this->language = $language; } /** * Process the complete questionnaire and generate AI analysis */ public function process(): array { try { // Step 1: Generate AI prompt $prompt = $this->generateAIPrompt(); // Step 2: Call AI service $aiResponse = $this->callAIService($prompt); // Step 3: Parse and structure the response $analysis = $this->parseAIResponse($aiResponse); // Step 4: Calculate scores and metrics $analysis['scores'] = $this->calculateScores(); $analysis['metrics'] = $this->calculateMetrics(); $analysis['tools'] = $this->recommendTools(); $analysis['timeline'] = $this->generateTimeline(); return [ 'success' => true, 'analysis' => $analysis, 'report_id' => $this->generateReportId(), 'timestamp' => date('Y-m-d H:i:s') ]; } catch (Exception $e) { return [ 'success' => false, 'error' => $e->getMessage(), 'fallback' => $this->generateFallbackAnalysis() ]; } } /** * Generate comprehensive AI prompt based on questionnaire answers */ private function generateAIPrompt(): string { $answers = $this->questionnaireData; // System prompt based on language $systemPrompts = [ 'de' => "Du bist ein KI-Beratungsexperte für kleine und mittlere Unternehmen in Deutschland. Analysiere diese KI-Readiness-Bewertung und erstelle eine professionelle, maßgeschneiderte Analyse.", 'en' => "You are an AI consulting expert for small and medium-sized businesses. Analyze this AI readiness assessment and create a professional, tailored analysis.", 'tr' => "Küçük ve orta ölçekli işletmeler için bir AI danışmanlık uzmanısınız. Bu AI hazırlık değerlendirmesini analiz edin ve profesyonel, özelleştirilmiş bir analiz oluşturun." ]; $systemPrompt = $systemPrompts[$this->language] ?? $systemPrompts['de']; // Build detailed user prompt $prompt = "Analysiere diese KI-Readiness-Bewertung:\n\n"; // Company Information $prompt .= "=== UNTERNEHMENSINFORMATIONEN ===\n"; if (!empty($answers['q2'])) { $prompt .= "Branche: " . $answers['q2'] . "\n"; } if (!empty($answers['q1'])) { $sizeMap = [ '1-person' => 'Einzelunternehmer (1 Person)', '2-5' => 'Kleinstunternehmen (2-5 Mitarbeiter)', '6-20' => 'Kleinunternehmen (6-20 Mitarbeiter)', '21-50' => 'Mittelstand (21-50 Mitarbeiter)', '50plus' => 'Großunternehmen (50+ Mitarbeiter)' ]; $prompt .= "Unternehmensgröße: " . ($sizeMap[$answers['q1']] ?? $answers['q1']) . "\n"; } // Business Model if (!empty($answers['q3']) && is_array($answers['q3'])) { $modelMap = [ 'dienstleistung' => 'Dienstleistung', 'handel' => 'Handel', 'coaching' => 'Coaching/Beratung', 'agentur' => 'Agentur', 'ecommerce' => 'E-Commerce', 'produktion' => 'Produktion' ]; $models = array_map(fn($m) => $modelMap[$m] ?? $m, $answers['q3']); $prompt .= "Geschäftsmodelle: " . implode(', ', $models) . "\n"; } // Primary Goals if (!empty($answers['q4'])) { $goalMap = [ 'zeit-sparen' => 'Zeit sparen bei repetitiven Aufgaben', 'kosten-reduzieren' => 'Kosten reduzieren durch Automatisierung', 'wachstum' => 'Wachstum beschleunigen', 'qualität' => 'Qualität verbessern', 'innovation' => 'Innovation vorantreiben' ]; $prompt .= "Primäres KI-Ziel: " . ($goalMap[$answers['q4']] ?? $answers['q4']) . "\n"; } // AI Importance if (!empty($answers['q5'])) { $importance = [ '1' => 'nicht wichtig', '2' => 'eher unwichtig', '3' => 'neutral', '4' => 'wichtig', '5' => 'sehr wichtig' ]; $prompt .= "KI-Bedeutung: " . ($importance[$answers['q5']] ?? $answers['q5']) . "/5\n"; } // Time-consuming Tasks if (!empty($answers['q6']) && is_array($answers['q6'])) { $taskMap = [ 'kundenkommunikation' => 'Kundenkommunikation', 'administrative' => 'Administrative Aufgaben', 'marketing' => 'Marketing/Content', 'buchhaltung' => 'Buchhaltung/Finanzen', 'planung' => 'Planung/Organisation', 'daten' => 'Datenanalyse' ]; $tasks = array_map(fn($t) => $taskMap[$t] ?? $t, $answers['q6']); $prompt .= "\nZeitintensive Aufgaben:\n- " . implode("\n- ", $tasks) . "\n"; } // Current Automation if (!empty($answers['q7'])) { $prompt .= "\nAktuelle Automatisierung:\n" . $answers['q7'] . "\n"; } // Weekly Hours on Repetitive Tasks if (!empty($answers['q8'])) { $hoursMap = [ 'unter-5h' => 'unter 5 Stunden/Woche', '5-10h' => '5-10 Stunden/Woche', '11-15h' => '11-15 Stunden/Woche', '16-20h' => '16-20 Stunden/Woche', '20plus' => 'über 20 Stunden/Woche' ]; $prompt .= "Repetitive Stunden/Woche: " . ($hoursMap[$answers['q8']] ?? $answers['q8']) . "\n"; } // Budget if (!empty($answers['q9'])) { $budgetMap = [ 'unter-50' => 'unter 50€/Monat', '50-100' => '50-100€/Monat', '100-300' => '100-300€/Monat', '300-500' => '300-500€/Monat', '500plus' => '500€+/Monat' ]; $prompt .= "KI-Budget: " . ($budgetMap[$answers['q9']] ?? $answers['q9']) . "\n"; } // Technical Affinity if (!empty($answers['q10'])) { $affinity = [ '1' => 'sehr schwer', '2' => 'eher schwer', '3' => 'neutral', '4' => 'einfach', '5' => 'sehr einfach' ]; $prompt .= "Technische Affinität: " . ($affinity[$answers['q10']] ?? $answers['q10']) . "/5\n"; } // Current AI Tools if (!empty($answers['q11']) && is_array($answers['q11'])) { $toolMap = [ 'chatgpt' => 'ChatGPT/Sprach-KIs', 'midjourney' => 'Bildgenerierung', 'crm' => 'KI-CRM Tools', 'marketing' => 'KI-Marketing Tools', 'automatisierung' => 'Automatisierungs-Tools', 'keine' => 'Keine KI-Tools' ]; $tools = array_map(fn($t) => $toolMap[$t] ?? $t, $answers['q11']); $prompt .= "Aktuelle KI-Tools: " . implode(', ', $tools) . "\n"; } // Biggest Challenge if (!empty($answers['q12'])) { $challengeMap = [ 'zeit' => 'Zeitmangel', 'wissen' => 'Fehlendes Wissen', 'kosten' => 'Kosten', 'integration' => 'Integration', 'nutzen' => 'Unklarheit über Nutzen' ]; $prompt .= "Größte Herausforderung: " . ($challengeMap[$answers['q12']] ?? $answers['q12']) . "\n"; } // Implementation Timeline if (!empty($answers['q13'])) { $timelineMap = [ 'sofort' => 'sofort (innerhalb 1 Monat)', 'kurz' => 'kurzfristig (1-3 Monate)', 'mittel' => 'mittelfristig (3-6 Monate)', 'lang' => 'langfristig (6+ Monate)', 'keine' => 'keine konkreten Pläne' ]; $prompt .= "Umsetzungszeitraum: " . ($timelineMap[$answers['q13']] ?? $answers['q13']) . "\n"; } $prompt .= "\n=== ANFORDERUNGEN FÜR DIE ANALYSE ===\n"; $prompt .= "Bitte erstelle eine strukturierte Analyse mit folgenden Abschnitten:\n"; $prompt .= "1. KI-Readiness Score (0-100) mit Begründung\n"; $prompt .= "2. Stärken des Unternehmens für KI-Implementierung\n"; $prompt .= "3. Verbesserungsbereiche\n"; $prompt .= "4. Konkrete KI-Anwendungsfälle für dieses Unternehmen\n"; $prompt .= "5. Quick Wins (schnell umsetzbare Maßnahmen)\n"; $prompt .= "6. Strategische Empfehlungen für die nächsten 12 Monate\n"; $prompt .= "7. Geschätzte Zeit- und Kosteneinsparungspotenziale\n\n"; $prompt .= "Antworte in einem professionellen, aber verständlichen Ton. Nutze Überschriften und Aufzählungen für bessere Lesbarkeit."; return json_encode([ 'model' => 'gpt-4', 'input' => [ ['role' => 'system', 'content' => $systemPrompt], ['role' => 'user', 'content' => $prompt] ], 'temperature' => 0.7, 'max_tokens' => 3000 ]); } /** * Call the AI service using LocalAIApi */ private function callAIService(string $prompt): array { $payload = json_decode($prompt, true); // Use LocalAIApi to call the AI service $response = LocalAIApi::createResponse($payload, [ 'poll_interval' => 3, 'poll_timeout' => 60 ]); if (empty($response['success'])) { throw new Exception('AI service error: ' . ($response['error'] ?? 'Unknown error')); } return $response; } /** * Parse AI response into structured format */ private function parseAIResponse(array $aiResponse): array { $text = LocalAIApi::extractText($aiResponse); // Try to parse as JSON first $json = LocalAIApi::decodeJsonFromResponse($aiResponse); if ($json) { return $this->parseStructuredJSON($json); } // Otherwise, parse the text return $this->parseTextResponse($text); } /** * Parse structured JSON response */ private function parseStructuredJSON(array $json): array { return [ 'score' => $json['score'] ?? $this->calculateScore(), 'score_explanation' => $json['score_explanation'] ?? '', 'strengths' => $json['strengths'] ?? [], 'improvements' => $json['improvements'] ?? [], 'use_cases' => $json['use_cases'] ?? [], 'quick_wins' => $json['quick_wins'] ?? [], 'recommendations' => $json['recommendations'] ?? [], 'estimated_savings' => $json['estimated_savings'] ?? [], 'full_analysis' => $json ]; } /** * Parse text response */ private function parseTextResponse(string $text): array { // Extract score from text preg_match('/Score[\s:]*(\d+)/i', $text, $scoreMatches); $score = isset($scoreMatches[1]) ? (int)$scoreMatches[1] : $this->calculateScore(); // Extract sections (simplified parsing) $sections = [ 'strengths' => $this->extractSection($text, ['Stärken', 'Stärke', 'Vorteile']), 'improvements' => $this->extractSection($text, ['Verbesserung', 'Schwächen', 'Herausforderung']), 'quick_wins' => $this->extractSection($text, ['Quick Wins', 'schnelle Maßnahmen', 'sofort umsetzbar']), 'recommendations' => $this->extractSection($text, ['Empfehlung', 'Maßnahmen', 'Vorschläge']) ]; return [ 'score' => $score, 'score_explanation' => $this->extractScoreExplanation($text), 'strengths' => $sections['strengths'], 'improvements' => $sections['improvements'], 'use_cases' => $this->extractUseCases($text), 'quick_wins' => $sections['quick_wins'], 'recommendations' => $sections['recommendations'], 'estimated_savings' => $this->extractSavings($text), 'full_analysis' => $text ]; } /** * Calculate readiness score based on answers */ private function calculateScore(): int { $score = 50; // Base score // Add points based on answers if (!empty($this->questionnaireData['q5'])) { $score += ((int)$this->questionnaireData['q5'] - 3) * 10; } if (!empty($this->questionnaireData['q10'])) { $score += ((int)$this->questionnaireData['q10'] - 3) * 8; } if (!empty($this->questionnaireData['q8'])) { $hoursMap = [ 'unter-5h' => -10, '5-10h' => 0, '11-15h' => 15, '16-20h' => 25, '20plus' => 30 ]; $score += $hoursMap[$this->questionnaireData['q8']] ?? 0; } if (!empty($this->questionnaireData['q13'])) { $timelineMap = [ 'sofort' => 20, 'kurz' => 15, 'mittel' => 10, 'lang' => 5, 'keine' => 0 ]; $score += $timelineMap[$this->questionnaireData['q13']] ?? 0; } return max(0, min(100, $score)); } /** * Calculate business metrics */ private function calculateMetrics(): array { $answers = $this->questionnaireData; // Time saving potential $hoursMap = [ 'unter-5h' => 10, '5-10h' => 20, '11-15h' => 30, '16-20h' => 40, '20plus' => 50 ]; $weeklyHours = $hoursMap[$answers['q8']] ?? 20; // Cost saving (assuming €50/hour) $monthlyCostSaving = $weeklyHours * 50 * 4.33; // Quick wins based on number of time-consuming tasks $quickWins = !empty($answers['q6']) && is_array($answers['q6']) ? min(count($answers['q6']), 8) : 3; return [ 'time_saving_weekly' => $weeklyHours . 'h', 'time_saving_monthly' => ($weeklyHours * 4.33) . 'h', 'cost_saving_monthly' => '€' . number_format($monthlyCostSaving, 0, ',', '.'), 'cost_saving_yearly' => '€' . number_format($monthlyCostSaving * 12, 0, ',', '.'), 'quick_wins_count' => $quickWins, 'roi_months' => 6 // Estimated ROI in months ]; } /** * Recommend tools based on answers */ private function recommendTools(): array { $answers = $this->questionnaireData; $tools = []; // Always recommend these basics $tools[] = [ 'name' => 'ChatGPT Plus', 'category' => 'Content & Kreativität', 'priority' => 'high', 'description' => 'Für Texterstellung, Ideen & Content', 'price' => '20€/Monat' ]; // Based on business model if (!empty($answers['q3']) && is_array($answers['q3'])) { if (in_array('dienstleistung', $answers['q3']) || in_array('coaching', $answers['q3'])) { $tools[] = [ 'name' => 'Calendly', 'category' => 'Terminplanung', 'priority' => 'medium', 'description' => 'Automatisierte Terminbuchung', 'price' => '10€/Monat' ]; } if (in_array('ecommerce', $answers['q3'])) { $tools[] = [ 'name' => 'Zapier', 'category' => 'Automatisierung', 'priority' => 'high', 'description' => 'App-Integration ohne Code', 'price' => '20€/Monat' ]; } if (in_array('agentur', $answers['q3']) || in_array('marketing', $answers['q3'])) { $tools[] = [ 'name' => 'Jasper AI', 'category' => 'Content Marketing', 'priority' => 'high', 'description' => 'Professionelle Marketing-Texte', 'price' => '39€/Monat' ]; } } // Based on time-consuming tasks if (!empty($answers['q6']) && is_array($answers['q6'])) { if (in_array('kundenkommunikation', $answers['q6'])) { $tools[] = [ 'name' => 'Pipedrive', 'category' => 'CRM & Vertrieb', 'priority' => 'high', 'description' => 'Visuelles CRM für den Vertrieb', 'price' => '15€/Monat' ]; } if (in_array('buchhaltung', $answers['q6'])) { $tools[] = [ 'name' => 'QuickBooks', 'category' => 'Buchhaltung', 'priority' => 'medium', 'description' => 'KI-gestützte Buchhaltung', 'price' => '25€/Monat' ]; } } // Based on budget if (!empty($answers['q9'])) { if ($answers['q9'] === 'unter-50') { $tools = array_slice($tools, 0, 2); // Limit to 2 tools for small budget } } return array_slice($tools, 0, 5); // Max 5 tools } /** * Generate implementation timeline */ private function generateTimeline(): array { $answers = $this->questionnaireData; if (empty($answers['q13'])) { return $this->getDefaultTimeline(); } $timelines = [ 'sofort' => [ ['month' => 1, 'action' => 'Quick Wins implementieren', 'tools' => ['ChatGPT', 'Calendly']], ['month' => 2, 'action' => 'Kundenkommunikation automatisieren', 'tools' => ['Pipedrive', 'Zapier']], ['month' => 3, 'action' => 'Reporting & Analyse aufbauen', 'tools' => ['Power BI', 'Google Analytics']] ], 'kurz' => [ ['month' => 1, 'action' => 'Machbarkeitsstudie', 'tools' => []], ['month' => 2, 'action' => 'Pilotprojekt starten', 'tools' => ['ChatGPT']], ['month' => 3, 'action' => 'Team schulen', 'tools' => []], ['month' => 4, 'action' => 'Erste Prozesse automatisieren', 'tools' => ['Zapier']] ], 'mittel' => [ ['month' => 1, 'action' => 'Strategie entwickeln', 'tools' => []], ['month' => 2, 'action' => 'Tools evaluieren', 'tools' => []], ['month' => 3, 'action' => 'Budget planen', 'tools' => []], ['month' => 4, 'action' => 'Pilot starten', 'tools' => []], ['month' => 5, 'action' => 'Erste Ergebnisse analysieren', 'tools' => []], ['month' => 6, 'action' => 'Skalierung planen', 'tools' => []] ], 'lang' => [ ['month' => 1, 'action' => 'Informationsphase', 'tools' => []], ['month' => 3, 'action' => 'Anforderungsanalyse', 'tools' => []], ['month' => 6, 'action' => 'Strategieentwicklung', 'tools' => []], ['month' => 9, 'action' => 'Pilotprojekt starten', 'tools' => []], ['month' => 12, 'action' => 'Evaluierung', 'tools' => []] ] ]; return $timelines[$answers['q13']] ?? $this->getDefaultTimeline(); } private function getDefaultTimeline(): array { return [ ['month' => 1, 'action' => 'Quick Wins umsetzen', 'tools' => ['ChatGPT']], ['month' => 2, 'action' => 'Prozessanalyse durchführen', 'tools' => []], ['month' => 3, 'action' => 'Erste Automatisierungen', 'tools' => ['Zapier']], ['month' => 6, 'action' => 'Ergebnisse evaluieren', 'tools' => []], ['month' => 12, 'action' => 'KI-Strategie skalieren', 'tools' => []] ]; } /** * Helper methods for text parsing */ private function extractSection(string $text, array $keywords): array { $lines = explode("\n", $text); $items = []; $inSection = false; foreach ($lines as $line) { $line = trim($line); // Check if we've entered a section foreach ($keywords as $keyword) { if (stripos($line, $keyword) !== false && strlen($line) < 100) { $inSection = true; continue 2; } } // Collect items in section if ($inSection && ($line === '' || stripos($line, '###') !== false)) { break; } if ($inSection && $line !== '' && preg_match('/^[-•\d.]+\s+(.+)$/', $line, $matches)) { $items[] = $matches[1]; } } return array_slice($items, 0, 5); } private function extractUseCases(string $text): array { // Simple extraction of numbered items preg_match_all('/\d+\.\s+(.+?)(?=\n\d+\.|\n###|$)/s', $text, $matches); return $matches[1] ?? ['Kundenkommunikation automatisieren', 'Content-Erstellung optimieren', 'Datenanalyse verbessern']; } private function extractSavings(string $text): array { preg_match_all('/(\d+[\d.,]*)\s*(?:Stunden|h|€|EUR)/i', $text, $matches); return $matches[0] ?? ['20-30 Stunden/Woche', '1.000-2.000€/Monat']; } private function extractScoreExplanation(string $text): string { $lines = explode("\n", $text); foreach ($lines as $line) { if (stripos($line, 'Score') !== false || stripos($line, 'Bewertung') !== false) { return $line; } } return ''; } private function generateReportId(): string { return 'KI-' . date('Ymd-His') . '-' . strtoupper(substr(md5(uniqid()), 0, 6)); } private function generateFallbackAnalysis(): array { return [ 'score' => $this->calculateScore(), 'score_explanation' => 'Basierend auf Ihren Antworten berechnet', 'strengths' => ['Bereitschaft zur Veränderung', 'Klares Ziel definiert'], 'improvements' => ['Prozessanalyse benötigt', 'Budgetplanung optimieren'], 'use_cases' => ['Kundenkommunikation automatisieren', 'Content-Erstellung optimieren'], 'quick_wins' => ['ChatGPT für E-Mail-Vorlagen nutzen', 'Automatische Terminbuchung einrichten'], 'recommendations' => ['Mit kleinen Projekten starten', 'Team schulen und einbinden'], 'estimated_savings' => ['20-30 Stunden/Woche', '1.000-2.000€/Monat'] ]; } } ?>