Specify explicit order values for SongGroup factories to avoid unique
constraint violations on the composite (song_id, order) key when
faker generates duplicate random values.
T20: Song DB Page
- Songs/Index.vue with search, action buttons, pagination
- Upload area for .pro files (calls T23 placeholder)
- Song-Datenbank nav link added to AuthenticatedLayout
- Tests: 9 new (44 assertions)
T21: Song DB Edit Popup
- SongEditModal.vue with metadata + ArrangementConfigurator
- Auto-save with fetch (500ms debounce for text, immediate on blur)
- Tests: 11 new (53 assertions)
T22: Song DB Translate Page
- Songs/Translate.vue with two-column editor
- URL fetch or manual paste, line-count constraints
- Group headers with colors, save marks has_translation=true
- Tests: 1 new (12 assertions)
T23: .pro File Placeholders
- ProParserNotImplementedException with HTTP 501
- ProFileController with importPro/downloadPro placeholders
- German error messages
- Tests: 5 new (7 assertions)
T24: Service Finalization + Status
- Two-step finalization with warnings (unmatched songs, missing slides)
- Download placeholder toast
- isReadyToFinalize accessor on Service model
- Tests: 11 new (30 assertions)
All tests passing: 174/174 (905 assertions)
Build: ✓ Vite production build successful
German UI: All user-facing text in German with 'Du' form
- SongPreviewModal.vue: Teleport modal with song text in arrangement order
- Group headers with group.color background
- Side-by-side translations when use_translation=true
- Copyright footer from song metadata
- Close button + click-outside/Escape dismiss
- PDF download button
- SongPdfController.php: PDF generation endpoint
- GET /songs/{song}/arrangements/{arrangement}/pdf
- Uses barryvdh/laravel-dompdf with DejaVu Sans font
- Old-school CSS only (NO Tailwind)
- Handles German umlauts correctly
- resources/views/pdf/song.blade.php: PDF template
- Title header, groups with colored headers, slide text, copyright footer
- Includes translation text when present
- Simple CSS: font-family, color, background-color, margin, padding
- Tests: 9 new (25 assertions)
- PDF content type verification
- Filename includes song title
- Groups in correct arrangement order
- Translation text included when present
- Copyright footer present
- German umlauts render correctly
- Auth guard
- 404 when arrangement doesn't belong to song
- Empty arrangement handling
All tests passing: 133/133 (728 assertions)
Build: ✓ Vite production build successful
Fix: Removed duplicate content from SongPdfTest.php (parse error)