false, 'event' => false, 'palette' => false, 'invite' => false, ]; } $hasCustomCollections = TaskCollection::query() ->where('tenant_id', $tenant->id) ->exists(); $hasEvent = $tenant->events()->exists(); $palette = Arr::get($tenant->settings ?? [], 'branding.palette'); $hasInvite = EventJoinToken::query() ->whereHas('event', fn ($query) => $query->where('tenant_id', $tenant->id)) ->exists(); return [ 'packages' => $hasCustomCollections, 'event' => $hasEvent, 'palette' => filled($palette), 'invite' => $hasInvite, ]; } public static function completed(?Tenant $tenant = null): bool { $status = self::status($tenant); return collect($status)->every(fn ($done) => $done === true) || Arr::has(self::tenant($tenant)?->settings ?? [], 'onboarding.completed_at'); } public static function markCompleted(Tenant $tenant, array $data = []): void { $settings = $tenant->settings ?? []; Arr::set($settings, 'onboarding.completed_at', Carbon::now()->toIso8601String()); if (Arr::has($data, 'primary_event_id')) { Arr::set($settings, 'onboarding.primary_event_id', Arr::get($data, 'primary_event_id')); } if (Arr::has($data, 'selected_packages')) { Arr::set($settings, 'onboarding.selected_packages', Arr::get($data, 'selected_packages')); } if (Arr::has($data, 'qr_layout')) { Arr::set($settings, 'onboarding.qr_layout', Arr::get($data, 'qr_layout')); } $tenant->forceFill(['settings' => $settings])->save(); } }