getCrmSettings($business_id)); return ! empty($settings['enable_ai_sentiment']) && ! empty($settings['enable_call_recording']); } public function storeRecording(CrmCallSession $session, UploadedFile $file): string { $path = $file->store('crm/call_recordings/'.$session->business_id, 'local'); $session->update(['recording_path' => $path]); return $path; } /** * Analyze recording and return suggested assessment fields. * Integrates with Communication agent when available; falls back to neutral. */ public function analyze(CrmCallSession $session): array { if (empty($session->recording_path) || ! $this->isEnabled($session->business_id)) { return [ 'sentiment' => 'neutral', 'objections' => [], 'suggested_notes' => '', ]; } $fullPath = Storage::disk('local')->path($session->recording_path); if (! file_exists($fullPath)) { return ['sentiment' => 'neutral', 'objections' => [], 'suggested_notes' => '']; } // Hook for Communication/Gemini agent — placeholder heuristic until agent wired $suggested = [ 'sentiment' => 'neutral', 'objections' => [], 'suggested_notes' => __('crm::lang.ai_analysis_pending'), ]; $session->update([ 'ai_suggested_sentiment' => $suggested['sentiment'], 'ai_suggested_objections' => json_encode($suggested['objections']), ]); return $suggested; } }