serviceQueue?->settings, 'announcement_locale', 'en'); $ticket->loadMissing(['organization', 'serviceQueue']); $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 { $destination = $counter->displayDestination(); $staff = trim((string) ($counter->staff_display_name ?? '')); $queueName = trim((string) ($ticket->serviceQueue?->name ?? '')); $industryAnnouncement = (array) data_get($ticket->organization?->settings, 'industry_package.announcement', []); $global = config('qms.announcement_templates', []); if ($staff !== '') { $richDestination = $queueName !== '' && ! str_contains(strtolower($destination), strtolower($queueName)) ? trim($queueName.' '.$destination) : $destination; $template = $industryAnnouncement['with_staff'] ?? $global['with_staff'] ?? ':ticket, :staff, :destination.'; return rtrim(str_replace( [':ticket', ':staff', ':destination', ':counter'], [$ticket->ticket_number, $staff, $richDestination, $richDestination], $template, ), '.').'.'; } $template = $industryAnnouncement[$locale] ?? $industryAnnouncement['en'] ?? $global[$locale] ?? $global['en'] ?? 'Ticket :ticket, please proceed to :destination.'; return str_replace( [':ticket', ':destination', ':counter'], [$ticket->ticket_number, $destination, $destination], $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()]); } }