Files
ladill-queue/app/Services/Qms/VoiceAnnouncementService.php
T
isaaccladandCursor af764f77fb
Deploy Ladill Queue / deploy (push) Successful in 28s
Fix display voice prompts requiring browser unlock and failed acks.
Add tap-to-enable speech overlay, stop marking announcements played on TTS errors, pick voices by locale, and scope pending announcements to the display's queues.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 22:21:56 +00:00

73 lines
2.5 KiB
PHP

<?php
namespace App\Services\Qms;
use App\Models\Counter;
use App\Models\Ticket;
use App\Models\VoiceAnnouncement;
class VoiceAnnouncementService
{
public function announceCalled(Ticket $ticket, Counter $counter, ?string $locale = null): VoiceAnnouncement
{
$locale ??= data_get($ticket->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<int>|null $queueIds
* @return list<array<string, mixed>>
*/
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()]);
}
}