qrCode; if (! $event || $event->type !== QrCode::TYPE_EVENT) { return; } $format = (string) ($event->content()['format'] ?? 'in_person'); if (! in_array($format, ['virtual', 'hybrid'], true)) { return; } if ((string) config('meet.key', '') === '' || ! $registration->attendee_email) { return; } $ownerRef = (string) $event->user->public_id; $client = MeetClient::for($ownerRef); foreach ((array) ($event->content()['virtual_sessions'] ?? []) as $session) { if (! is_array($session)) { continue; } $roomUuid = trim((string) ($session['meet_room_uuid'] ?? '')); if ($roomUuid === '') { continue; } try { $client->updateRoom($roomUuid, [ 'invite_emails' => [$registration->attendee_email], ]); } catch (\Throwable $e) { Log::warning('Events Meet invite failed', [ 'registration_id' => $registration->id, 'room_uuid' => $roomUuid, 'error' => $e->getMessage(), ]); } } $metadata = (array) ($registration->metadata ?? []); $metadata['meet_invited_at'] = now()->toIso8601String(); $registration->update(['metadata' => $metadata]); } public function isJoinWindowOpen(array $session, int $minutesBefore = 15): bool { $scheduled = trim((string) ($session['scheduled_at'] ?? '')); if ($scheduled === '') { return true; } try { $start = \Carbon\Carbon::parse($scheduled); } catch (\Throwable) { return true; } $duration = max(15, (int) ($session['duration_minutes'] ?? 60)); return now()->between($start->copy()->subMinutes($minutesBefore), $start->copy()->addMinutes($duration)); } }