whereDate('date', '>=', Carbon::today()) ->orderBy('date') ->withCount([ 'serviceSongs as songs_total_count', 'serviceSongs as songs_mapped_count' => fn ($query) => $query->whereNotNull('song_id'), 'serviceSongs as songs_arranged_count' => fn ($query) => $query->whereNotNull('song_arrangement_id'), ]) ->addSelect([ 'has_sermon_slides' => Slide::query() ->selectRaw('CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END') ->whereColumn('slides.service_id', 'services.id') ->where('slides.type', 'sermon'), 'info_slides_count' => Slide::query() ->selectRaw('COUNT(*)') ->where('slides.type', 'information') ->where(function ($query) { $query ->whereNull('slides.service_id') ->orWhereColumn('slides.service_id', 'services.id'); }) ->whereNotNull('slides.expire_date') ->whereColumn('slides.expire_date', '>=', 'services.date'), ]) ->get() ->map(fn (Service $service) => [ 'id' => $service->id, 'title' => $service->title, 'date' => $service->date?->toDateString(), 'preacher_name' => $service->preacher_name, 'beamer_tech_name' => $service->beamer_tech_name, 'last_synced_at' => $service->last_synced_at?->toJSON(), 'updated_at' => $service->updated_at?->toJSON(), 'finalized_at' => $service->finalized_at?->toJSON(), 'songs_total_count' => (int) $service->songs_total_count, 'songs_mapped_count' => (int) $service->songs_mapped_count, 'songs_arranged_count' => (int) $service->songs_arranged_count, 'has_sermon_slides' => (bool) $service->has_sermon_slides, 'info_slides_count' => (int) $service->info_slides_count, ]) ->values(); return Inertia::render('Services/Index', [ 'services' => $services, ]); } public function finalize(Service $service): RedirectResponse { $service->update([ 'finalized_at' => now(), ]); return redirect() ->route('services.index') ->with('success', 'Service wurde abgeschlossen.'); } public function reopen(Service $service): RedirectResponse { $service->update([ 'finalized_at' => null, ]); return redirect() ->route('services.index') ->with('success', 'Service wurde wieder geoeffnet.'); } }