diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 5167b75..9c88150 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -12,6 +12,7 @@ use App\Models\Antrian; use App\Models\Poli; use App\Models\RiwayatPanggilan; +use App\Services\AudioService; use Barryvdh\DomPDF\Facade\Pdf; @@ -724,4 +725,96 @@ public function cetakAntrian(Antrian $antrian) ], 500); } } + + /** + * Play audio for queue call + */ + public function playQueueCallAudio(Request $request) + { + try { + $request->validate([ + 'poli_name' => 'required|string' + ]); + + $poliName = $request->input('poli_name'); + + // Get audio sequence from AudioService + $audioService = app(AudioService::class); + $result = $audioService->getQueueCallAudio($poliName); + + return response()->json($result); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Error playing audio: ' . $e->getMessage() + ], 500); + } + } + + /** + * Panggil antrian selanjutnya berdasarkan poli + */ + public function panggilSelanjutnya(Request $request) + { + try { + $request->validate([ + 'poli_name' => 'required|string' + ]); + + $poliName = $request->input('poli_name'); + + // Cari antrian berikutnya yang status 'menunggu' + $antrianSelanjutnya = Antrian::whereHas('poli', function($query) use ($poliName) { + $query->where('nama_poli', $poliName); + }) + ->where('status', 'menunggu') + ->whereDate('created_at', today()) + ->orderBy('created_at', 'asc') + ->first(); + + if (!$antrianSelanjutnya) { + return response()->json([ + 'success' => false, + 'message' => 'Tidak ada antrian yang menunggu untuk ' . $poliName + ]); + } + + // Update status menjadi 'dipanggil' + $antrianSelanjutnya->update([ + 'status' => 'dipanggil', + 'waktu_panggil' => now() + ]); + + // Catat di riwayat panggilan + \App\Models\RiwayatPanggilan::create([ + 'antrian_id' => $antrianSelanjutnya->id, + 'waktu_panggilan' => now(), + 'admin_id' => auth()->id() + ]); + + // Get audio sequence + $audioService = app(AudioService::class); + $audioResult = $audioService->getQueueCallAudio($poliName); + + return response()->json([ + 'success' => true, + 'message' => 'Antrian ' . $antrianSelanjutnya->no_antrian . ' berhasil dipanggil', + 'antrian' => [ + 'id' => $antrianSelanjutnya->id, + 'no_antrian' => $antrianSelanjutnya->no_antrian, + 'poli_name' => $poliName, + 'user_name' => $antrianSelanjutnya->user->nama, + 'status' => 'dipanggil' + ], + 'audio_sequence' => $audioResult['audio_sequence'] + ]); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan: ' . $e->getMessage() + ], 500); + } + } } diff --git a/app/Http/Controllers/AudioController.php b/app/Http/Controllers/AudioController.php new file mode 100644 index 0000000..3cc4fdc --- /dev/null +++ b/app/Http/Controllers/AudioController.php @@ -0,0 +1,67 @@ +audioService = $audioService; + } + + /** + * Show audio management page + */ + public function index() + { + return view('admin.audio.index'); + } + + /** + * Get audio sequence for queue call + */ + public function getQueueCallAudio(Request $request) + { + $request->validate([ + 'poli_name' => 'required|string' + ]); + + $poliName = $request->input('poli_name'); + $result = $this->audioService->getQueueCallAudio($poliName); + + return response()->json($result); + } + + /** + * Get available audio files + */ + public function getAvailableAudioFiles() + { + $files = $this->audioService->getAvailableAudioFiles(); + + return response()->json([ + 'success' => true, + 'files' => $files + ]); + } + + /** + * Test audio playback + */ + public function testAudio(Request $request) + { + $request->validate([ + 'poli_name' => 'required|string' + ]); + + $poliName = $request->input('poli_name'); + $result = $this->audioService->getQueueCallAudio($poliName); + + return response()->json($result); + } +} diff --git a/app/Http/Controllers/DisplayController.php b/app/Http/Controllers/DisplayController.php index 3a7949b..170ed08 100644 --- a/app/Http/Controllers/DisplayController.php +++ b/app/Http/Controllers/DisplayController.php @@ -10,54 +10,73 @@ class DisplayController extends Controller { public function index() { + // Get all available polis + $polis = Poli::all(); + // Current: sedang dipanggil per poli - $poliUmumCurrent = Antrian::where('poli_id', 1) + $poliUmumCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'umum'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') ->first(); - $poliGigiCurrent = Antrian::where('poli_id', 2) + $poliGigiCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'gigi'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') ->first(); - $poliJiwaCurrent = Antrian::where('poli_id', 3) + $poliJiwaCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'kesehatan jiwa'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') ->first(); - $poliTradisionalCurrent = Antrian::where('poli_id', 4) + $poliTradisionalCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'kesehatan tradisional'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') ->first(); // Next: menunggu per poli (maks 3) - $poliUmumNext = Antrian::where('poli_id', 1) + $poliUmumNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'umum'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') ->take(3) ->get(); - $poliGigiNext = Antrian::where('poli_id', 2) + $poliGigiNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'gigi'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') ->take(3) ->get(); - $poliJiwaNext = Antrian::where('poli_id', 3) + $poliJiwaNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'kesehatan jiwa'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') ->take(3) ->get(); - $poliTradisionalNext = Antrian::where('poli_id', 4) + $poliTradisionalNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'kesehatan tradisional'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') @@ -107,19 +126,25 @@ public function checkNewCalls(Request $request) public function getDisplayData() { // Current: sedang dipanggil per poli - $poliUmumCurrent = Antrian::where('poli_id', 1) + $poliUmumCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'umum'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') ->first(); - $poliGigiCurrent = Antrian::where('poli_id', 2) + $poliGigiCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'gigi'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') ->first(); - $poliJiwaCurrent = Antrian::where('poli_id', 3) + $poliJiwaCurrent = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'kesehatan jiwa'); + }) ->where('status', 'dipanggil') ->whereDate('created_at', today()) ->orderByDesc('updated_at') @@ -132,21 +157,26 @@ public function getDisplayData() ->first(); // Next: menunggu per poli (maks 3) - $poliUmumNext = Antrian::where('poli_id', 1) + $poliUmumNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'umum'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') ->take(3) ->get(); - $poliGigiNext = Antrian::where('poli_id', 2) + $poliGigiNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'gigi'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') - ->take(3) ->get(); - $poliJiwaNext = Antrian::where('poli_id', 3) + $poliJiwaNext = Antrian::whereHas('poli', function($query) { + $query->where('nama_poli', 'kesehatan jiwa'); + }) ->where('status', 'menunggu') ->whereDate('created_at', today()) ->orderBy('created_at', 'asc') diff --git a/app/Services/AudioService.php b/app/Services/AudioService.php new file mode 100644 index 0000000..b64dba8 --- /dev/null +++ b/app/Services/AudioService.php @@ -0,0 +1,81 @@ +normalizePoliName($poliName); + + // Check if audio file exists for this poli + $poliAudioFile = "assets/music/tts/antrian selanjutnya. poli {$normalizedPoliName}.mp3"; + + if (!file_exists(public_path($poliAudioFile))) { + // Fallback to default audio + $poliAudioFile = "assets/music/tts/antrian selanjutnya. poli umum.mp3"; + } + + return [ + 'success' => true, + 'audio_sequence' => [ + [ + 'type' => 'audio_file', + 'url' => asset('assets/music/announcement.mp3'), + 'duration' => 4000 // 4 seconds + ], + [ + 'type' => 'delay', + 'duration' => 1000 // 1 second delay between announcement and antrian + ], + [ + 'type' => 'audio_file', + 'url' => asset($poliAudioFile), + 'duration' => 4000 // 4 seconds + ] + ] + ]; + } + + /** + * Normalize poli name to match audio file names + */ + private function normalizePoliName($poliName) + { + $poliName = strtolower(trim($poliName)); + + // Map poli names to match audio files + $poliMap = [ + 'umum' => 'umum', + 'gigi' => 'gigi', + 'kesehatan jiwa' => 'jiwa', + 'jiwa' => 'jiwa', + 'kesehatan tradisional' => 'Tradisional', + 'tradisional' => 'Tradisional' + ]; + + return $poliMap[$poliName] ?? 'umum'; + } + + /** + * Get all available audio files + */ + public function getAvailableAudioFiles() + { + $audioDir = public_path('assets/music/tts'); + $files = []; + + if (is_dir($audioDir)) { + $audioFiles = glob($audioDir . '/*.mp3'); + foreach ($audioFiles as $file) { + $files[] = basename($file); + } + } + + return $files; + } +} diff --git a/config/services.php b/config/services.php index adaaab2..3dc958e 100644 --- a/config/services.php +++ b/config/services.php @@ -36,7 +36,7 @@ ], 'google' => [ - 'tts_api_key' => env('GOOGLE_TTS_API_KEY'), + ], ]; diff --git a/public/assets/music/call-to-attention-123107.mp3 b/public/assets/music/announcement.mp3 similarity index 100% rename from public/assets/music/call-to-attention-123107.mp3 rename to public/assets/music/announcement.mp3 diff --git a/public/assets/music/tts/antrian selanjutnya. poli Tradisional.mp3 b/public/assets/music/tts/antrian selanjutnya. poli Tradisional.mp3 new file mode 100644 index 0000000..c92a792 Binary files /dev/null and b/public/assets/music/tts/antrian selanjutnya. poli Tradisional.mp3 differ diff --git a/public/assets/music/tts/antrian selanjutnya. poli gigi.mp3 b/public/assets/music/tts/antrian selanjutnya. poli gigi.mp3 new file mode 100644 index 0000000..ce1d5c0 Binary files /dev/null and b/public/assets/music/tts/antrian selanjutnya. poli gigi.mp3 differ diff --git a/public/assets/music/tts/antrian selanjutnya. poli jiwa.mp3 b/public/assets/music/tts/antrian selanjutnya. poli jiwa.mp3 new file mode 100644 index 0000000..1807387 Binary files /dev/null and b/public/assets/music/tts/antrian selanjutnya. poli jiwa.mp3 differ diff --git a/public/assets/music/tts/antrian selanjutnya. poli umum.mp3 b/public/assets/music/tts/antrian selanjutnya. poli umum.mp3 new file mode 100644 index 0000000..9169e08 Binary files /dev/null and b/public/assets/music/tts/antrian selanjutnya. poli umum.mp3 differ diff --git a/resources/views/admin/audio/index.blade.php b/resources/views/admin/audio/index.blade.php new file mode 100644 index 0000000..e13f8c3 --- /dev/null +++ b/resources/views/admin/audio/index.blade.php @@ -0,0 +1,244 @@ +@extends('layouts.app') + +@section('title', 'Audio Management') + +@section('content') +
Kelola dan test audio untuk panggilan antrian
+Test audio untuk setiap poli
+Daftar file audio yang tersedia
+Loading audio files...
+