serviceQueue?->settings, 'announcement_locale', 'en'); $message = $this->buildMessage($ticket, $counter, $locale); return VoiceAnnouncement::create([ 'owner_ref' => $ticket->owner_ref, 'organization_id' => $ticket->organization_id, 'branch_id' => $ticket->branch_id, 'ticket_id' => $ticket->id, 'locale' => $locale, 'message' => $message, 'voice' => data_get($ticket->serviceQueue?->settings, 'voice', 'female'), 'volume' => (int) data_get($ticket->serviceQueue?->settings, 'announcement_volume', 80), 'repeat_count' => (int) data_get($ticket->serviceQueue?->settings, 'announcement_repeat', 1), 'status' => 'pending', ]); } protected function buildMessage(Ticket $ticket, Counter $counter, string $locale): string { $templates = config('qms.announcement_templates'); $template = $templates[$locale] ?? $templates['en']; return str_replace( [':ticket', ':counter'], [$ticket->ticket_number, $counter->name], $template, ); } /** * @param list|null $queueIds * @return list> */ public function pendingForBranch(int $branchId, ?array $queueIds = null, int $limit = 10): array { return VoiceAnnouncement::query() ->where('branch_id', $branchId) ->where('status', 'pending') ->when($queueIds, function ($query, array $queueIds) { $query->whereHas('ticket', fn ($ticket) => $ticket->whereIn('service_queue_id', $queueIds)); }) ->orderBy('id') ->limit($limit) ->get() ->map(fn (VoiceAnnouncement $a) => [ 'id' => $a->id, 'message' => $a->message, 'locale' => $a->locale, 'voice' => $a->voice, 'volume' => $a->volume, 'repeat_count' => $a->repeat_count, ]) ->all(); } public function markPlayed(VoiceAnnouncement $announcement): void { $announcement->update(['status' => 'played', 'played_at' => now()]); } }