Reverb infra + Kanban live refresh

- laravel/reverb instalat + reverb:install (config/reverb.php, channels.php)
- routes/channels.php: tenant.{slug} private channel cu auth check
  user.company_id == tenant.id
- App\Events\WorkOrderUpdated implements ShouldBroadcast pe
  PrivateChannel('tenant.{slug}'); broadcastAs 'work-order.updated'
- WorkOrder::booted dispatch event la fiecare update (skip if broadcast=log)
- Filament panel BODY_END inject:
  - Pusher JS de la CDN (compatibil Reverb)
  - Echo client conectat la Reverb (config dinamic din env)
  - Subscribe pe tenant private channel; la 'work-order.updated' →
    Livewire.all().forEach($refresh)
- Kanban view: wire:poll.5s (live refresh fallback) +
  x-on:autocrm:wo-updated.window=$refresh (instant când WS e activ)

Pentru moment BROADCAST_CONNECTION=log în Coolify (Reverb nu e deployat).
Când deployezi Reverb container separat:
  Coolify → New App → Same repo → CMD override:
    php artisan reverb:start --host=0.0.0.0 --port=8080
  → FQDN: ws.service.mir.md:8080
  → Set BROADCAST_CONNECTION=reverb pe AutoCRM app
  → Real-time instant fără cod nou.
This commit is contained in:
2026-05-07 14:25:26 +00:00
parent 09fd0bada2
commit 7ce78c350c
10 changed files with 1299 additions and 5 deletions
+13 -1
View File
@@ -109,7 +109,7 @@ class WorkOrder extends Model
return sprintf('WO-%s-%04d', $year, $count + 1);
}
/** Auto-send 'ready' email when status transitions to 'ready'. */
/** Auto-send 'ready' email + broadcast WS event on status change. */
protected static function booted(): void
{
static::updated(function (self $wo) {
@@ -120,6 +120,18 @@ class WorkOrder extends Model
) {
app(\App\Services\NotificationDispatcher::class)->workOrderReady($wo);
}
// Broadcast real-time update on any field change (skip if broadcasting=log).
if (config('broadcasting.default') !== 'log') {
try {
$company = \App\Models\Central\Company::withoutGlobalScopes()->find($wo->company_id);
if ($company) {
\App\Events\WorkOrderUpdated::dispatch($wo, $company->slug);
}
} catch (\Throwable $e) {
\Illuminate\Support\Facades\Log::debug('WO broadcast skipped: ' . $e->getMessage());
}
}
});
}
}