'date', 'finalized_at' => 'datetime', 'last_synced_at' => 'datetime', 'cts_data' => 'array', ]; } public function serviceSongs(): HasMany { return $this->hasMany(ServiceSong::class); } public function slides(): HasMany { return $this->hasMany(Slide::class); } /** * Check finalization prerequisites and return warnings. * * @return array{ready: bool, warnings: string[]} */ public function finalizationStatus(): array { $warnings = []; $totalSongs = $this->serviceSongs()->count(); $mappedSongs = $this->serviceSongs()->whereNotNull('song_id')->count(); $arrangedSongs = $this->serviceSongs()->whereNotNull('song_arrangement_id')->count(); $sermonSlides = $this->slides()->where('type', 'sermon')->count(); if ($totalSongs > 0 && $mappedSongs < $totalSongs) { $warnings[] = "Nur {$mappedSongs} von {$totalSongs} Songs sind zugeordnet."; } if ($totalSongs > 0 && $arrangedSongs < $totalSongs) { $warnings[] = "Nur {$arrangedSongs} von {$totalSongs} Songs haben ein Arrangement."; } if ($sermonSlides === 0) { $warnings[] = 'Es wurden keine Predigtfolien hochgeladen.'; } return [ 'ready' => empty($warnings), 'warnings' => $warnings, ]; } protected function isReadyToFinalize(): Attribute { return Attribute::get(fn () => $this->finalizationStatus()['ready']); } }