Commit graph

86 commits

Author SHA1 Message Date
Thorsten Bus 6061e4c4dd feat(service): add image columns and overrides
Enable storage-backed key visuals and background images plus service-specific moderator and preacher name overrides.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-31 00:01:24 +02:00
Thorsten Bus 73a523d0e1 feat(images): cover-fit conversion mode 2026-05-30 23:56:05 +02:00
Thorsten Bus 03fdfac3d3 test(e2e): add CCLI paste import, bookmarklet, and translation pairing e2e tests 2026-05-11 10:36:44 +02:00
Thorsten Bus 35d3298251 feat(ccli): add CcliPasteController endpoints
- POST /api/ccli/preview: parse-only endpoint (no DB writes)
- POST /api/songs/import-from-ccli-paste: 3 modes (create / pair-with-song / assign-to-service-song)
- GET /songs/import-from-ccli-paste: Inertia page with base64 bookmarklet prefill
- Routes guarded by auth:sanctum + throttle:30,1 (API); auth + web stack (web)
- Maps DuplicateCcliSongException to 409 with existing_song_id and edit_url
- Pest tests (10 cases, 63 assertions): preview, all 3 import modes, 409 dup, 422 errors, unauth, prefill happy/error, login redirect
2026-05-11 09:23:11 +02:00
Thorsten Bus cd0a72124d feat(ccli): serve CCLI bookmarklet JS 2026-05-10 19:34:30 +02:00
Thorsten Bus cd44d6289c feat(ccli): add CcliTranslationPairingService
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-10 19:02:10 +02:00
Thorsten Bus 091e00f255 feat(ccli): add CcliImportService for song upsert
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-10 18:56:38 +02:00
Thorsten Bus e4e5df912e fix(ccli): parse common CCLI metadata 2026-05-10 18:54:33 +02:00
Thorsten Bus 9412ca71c9 feat(ccli): implement CcliPasteParser parsing logic 2026-05-10 18:49:18 +02:00
Thorsten Bus 55a3ea3df8 feat(ccli): scaffold CcliPasteParser service 2026-05-10 18:42:21 +02:00
Thorsten Bus 85608f774d feat(settings): add default translation language setting 2026-05-10 18:38:14 +02:00
Thorsten Bus 73b7afcc2f feat(songs): track CCLI import metadata on songs table 2026-05-10 18:33:24 +02:00
Thorsten Bus 5c590eda9e feat(ccli): add section-label constants and language mapping 2026-05-10 18:28:18 +02:00
Thorsten Bus 02de6b03c0 test(ccli): add fixture corpus for CCLI paste parser
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-10 18:24:29 +02:00
Thorsten Bus 6ce5b6e018 feat(controllers): add macro/label import + global assignment + service override controllers and routes
- MacroImportController + LabelImportController: POST endpoints accepting uploaded .bin files,
  delegating to MacrosImportService / LabelsImportService and returning import stats / warnings as JSON.
  Generic German 422 error if parser rejects the file.
- MacroAssignmentController: index renders Settings Inertia page with assignments / macros / labels /
  collections / last-import metadata. store/update/destroy/reorder for global MacroAssignment rows.
- ServiceMacroOverrideController: store snapshots all matching global MacroAssignments into
  service-specific rows when a service opts to override; destroy removes both override and
  service-specific assignments. storeAssignment / updateAssignment / destroyAssignment manage the
  per-service rows directly.
- routes/web.php: 12 new named routes inside the auth middleware group; reorder route placed before
  {macroAssignment} parameter route to avoid capture conflict.
- Tests: 19 new Pest tests across 4 feature files (54 assertions). Full suite 376 passed.
2026-05-03 23:17:04 +02:00
Thorsten Bus cef247336e feat(export): use MacroResolutionService in ProExportService for flexible macro injection 2026-05-03 23:08:22 +02:00
Thorsten Bus 81b2a9caf6 feat(services): add LabelsImportService, MacrosImportService, MacroResolutionService 2026-05-03 23:03:32 +02:00
Thorsten Bus bdbf0c65e3 refactor(php): rename SongGroup references throughout controllers/services/tests
Replace all SongGroup/SongArrangementGroup model usages with Label/SongArrangementLabel
after the schema migration to global labels. Updates 12 app files and 11 test files:

- SongService: createDefaultGroups now finds-or-creates global Labels by name
- ArrangementController: validates label_id (labels are global, no song-ownership)
- ProImportService: imports groups as Labels (firstOrCreate by name); does not
  overwrite existing label colors per spec
- ProExportService/SongPdfController/TranslationService/etc: traverse via
  arrangements -> arrangementLabels -> label -> songSlides chain
- All test factories and assertions adapted to label-based schema
2026-05-03 22:55:02 +02:00
Thorsten Bus a1612dc3ef feat(support): add MacroColorConverter utility 2026-05-03 22:31:44 +02:00
Thorsten Bus 2a02f65517 test: update DatabaseSchemaTest and WipeLegacySongDataTest for new schema 2026-05-03 22:21:49 +02:00
Thorsten Bus bf153b2906 feat(db): auto-migrate 4 legacy macro settings to new assignment system 2026-05-03 22:20:07 +02:00
Thorsten Bus 2b27aa50d5 feat(db)!: drop song_groups, introduce label_id on song_slides, add song_arrangement_labels (BREAKING) 2026-05-03 22:20:01 +02:00
Thorsten Bus a65bf3d595 feat(db): add macro_assignments, service macro override tables, and guarded legacy data wipe 2026-05-03 22:16:46 +02:00
Thorsten Bus 09ab4821fc feat(db): create macros, macro_collections, and junction tables 2026-05-03 22:13:28 +02:00
Thorsten Bus 767e22eac8 feat(db): create labels table for global slide labels
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-03 22:10:35 +02:00
Thorsten Bus e489a984eb chore(deps): bump PHP to 8.4 and update propresenter/parser with Macro/Label support
- Raise PHP requirement from ^8.2 to ^8.4 (parser requires 8.4)
- New parser classes available: MacrosFileReader, LabelsFileReader,
  Macro, MacroLibrary, MacroCollection, Label, LabelLibrary
- Add programmatic test fixtures for macros-sample.bin + labels-sample.bin
- Fix ServiceAgendaItemFactory sort_order to auto-increment
2026-05-03 22:07:56 +02:00
Thorsten Bus 599b8635c9 feat(dev): migrate local development from Valet to DDEV
Production Caddy/FPM setup (build/Dockerfile, docker-compose.yml) is untouched -- this only swaps the local dev stack.

- .ddev/config.yaml: PHP 8.4, Node 20, sqlite (db container omitted), libreoffice/ghostscript/poppler/sqlite3 packages, Vite port 5173 via Traefik, post-start hooks bootstrap the app on every `ddev start`.
- .ddev/commands/web/dev: custom `ddev dev` runs queue + pail + vite (mirror of old `composer dev`).
- start_dev.sh / stop_dev.sh: rewritten as DDEV wrappers so devs can onboard without DDEV knowledge; --keep-ddev keeps containers up.
- vite.config.js: HMR over WSS to https://pp-planer.ddev.site:5173.
- playwright + auth.setup.ts: baseURL switched to https://pp-planer.ddev.site.
- .env.example: APP_URL and CHURCHTOOLS_REDIRECT_URI use ddev.site.
- composer: drop laravel/sail (replaced by DDEV).
- package.json: add explicit "name" so host/container lockfiles match (container WORKDIR is /var/www/html, npm would otherwise pick "html" as project name).
- tests/fixtures/propresenter/Test.pro: inline reference fixture; tests no longer depend on a sibling host directory.
- AGENTS.md: docs rewritten for DDEV workflow.
2026-05-03 18:46:48 +02:00
Thorsten Bus 1eb4f1642f rename cts-work to pp-planer, move Dockerfile to build/, optimize dev scripts
- Rename all cts-work references to pp-planer (valet, sanctum, playwright, e2e, docs)
- Fix docker-compose build context to use project root with build/Dockerfile
- Add .dockerignore to exclude unnecessary files from Docker build
- start_dev.sh: stale PID cleanup, dependency checks, APP_KEY check, process health verification
- stop_dev.sh: fix set -e crash on arithmetic, report already-dead processes, idempotent exit
2026-03-30 16:00:02 +02:00
Thorsten Bus af46e1829d feat: switch propresenter/parser to remote VCS, add local dev toggle script
Replace path repository with VCS pointing to
git.stadtmission-butzbach.de/public/propresenter-php.git.
Add use_local_pp_lib.sh to toggle between remote and local checkout.
Fix test fixture paths after repo restructure (ref/ → doc/reference_samples/).
2026-03-30 13:45:42 +02:00
Thorsten Bus 2ba612072f fix: resolve 17 pre-existing test failures (path refs, Mockery alias mocks)
- Update propresenter ref path from ../propresenter-work/ to ../propresenter/
- Fix ProFileImportTest assertion for CCLI-based upsert behavior
- Replace Mockery alias mocks with testable subclass pattern in
  PlaylistExportTest, eliminating @runInSeparateProcess requirement
- Use DI (app()) for PlaylistExportService in controller for testability
- All 302 tests pass (was 285 pass + 17 fail)
2026-03-30 12:43:50 +02:00
Thorsten Bus 0e3c647cfc feat: probundle export with media, image upscaling, upload dimension warnings
- Fix probundle exports missing images (double slides/ prefix in storage path)
- Replace manual ZipArchive with PresentationBundle + ProBundleWriter from parser plugin
- Add per-agenda-item download route and buttons for songs and slide items
- Remove text layer from image-only slides in .pro generation
- Fix image conversion: upscale small images, black bars on 2 sides max (contain)
- Add upload warnings for non-16:9 and sub-1920x1080 images (German, non-blocking)
- Update SlideFactory and all tests to use slides/ prefix in stored_filename
- Add 11 new tests (agenda download, image conversion, upload warnings)
2026-03-30 10:29:37 +02:00
Thorsten Bus 4c119b647d feat: add has_agenda flag to services and guard agenda sync
Events without an agenda in ChurchTools now gracefully set has_agenda=false
instead of throwing errors during sync. The edit/finalize buttons are
disabled in the frontend for services without an agenda.

Also fixes missing cts_song_id column on service_songs table.
2026-03-29 15:22:32 +02:00
Thorsten Bus 6964931286 test(e2e): Playwright tests for restructured edit page 2026-03-29 12:26:11 +02:00
Thorsten Bus fb1e51361f test(php): update existing tests for agenda model
- Fix uploaded_at in InformationBlockTest and ServiceControllerTest
  (Faker ignores Carbon::setTestNow, generating future dates that fail
  the uploaded_at <= service.date filter)
- Add agenda item association tests to ModerationBlockTest (3 new tests)
- Add agenda item association tests to SermonBlockTest (3 new tests)
- Verify legacy slides without agenda item still work

Test results: 12 failures (down from 14 baseline), all pre-existing
(ProPresenter parser path issues + suite ordering flake)
2026-03-29 12:26:05 +02:00
Thorsten Bus e88079e211 feat(ui): update service list status columns for agenda model 2026-03-29 12:18:50 +02:00
Thorsten Bus 18d0d6f965 feat(export): wire agenda export into download flow 2026-03-29 12:17:50 +02:00
Thorsten Bus 45955b70a2 feat(ui): add slide upload on agenda items 2026-03-29 12:12:58 +02:00
Thorsten Bus de431d29cc feat(export): agenda-ordered playlist export 2026-03-29 11:59:38 +02:00
Thorsten Bus 88661c6bef feat(sync): sync all CTS agenda items (not just songs) 2026-03-29 11:54:50 +02:00
Thorsten Bus 0b671956d6 feat(controller): pass agenda items to edit page 2026-03-29 11:48:28 +02:00
Thorsten Bus 2d70026a20 refactor(model): update finalizationStatus for agenda model 2026-03-29 11:46:54 +02:00
Thorsten Bus 7a71b8b2de chore(debug): add CTS agenda type discovery command 2026-03-29 11:39:24 +02:00
Thorsten Bus 1f367b6f37 feat(settings): add agenda configuration keys 2026-03-29 11:37:33 +02:00
Thorsten Bus 03224ffa06 feat(service): add AgendaMatcherService with wildcard namesmatching 2026-03-29 11:37:06 +02:00
Thorsten Bus 31d7634dbf feat(db): add service_agenda_items table + slides FK migration 2026-03-29 11:34:55 +02:00
Thorsten Bus 894e26f37d fix(test): use deterministic uploaded_at in ServiceControllerTest
Faker's dateTimeBetween ignores Carbon::setTestNow, producing dates
after the frozen test time. This caused the info_slides_count
assertion to fail non-deterministically when the system date diverged
from the test-frozen date.
2026-03-06 10:28:27 +01:00
Thorsten Bus 044b94b080 refactor(export): use in-memory content for zip bundle and playlist entries
Replace file-path-based zip entries with in-memory content via
file_get_contents. Rename .pro entry to 'data' (raw protobuf),
add addStoredEntry() helper with CM_STORE compression, and remove
temp directory management.
2026-03-06 10:25:21 +01:00
Thorsten Bus 149389a382 fix(test): add deterministic order values in SongPdfTest
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.
2026-03-02 23:02:58 +01:00
Thorsten Bus b40c371edc feat(export): embed slide blocks in playlist and add roundtrip test
Add information, moderation, and sermon slide presentations as .pro
files in the generated .proplaylist bundle. Each block queries slides
by type/service, converts stored images, and generates a ProPresenter
presentation via ProFileGenerator.

Add test_download_pro_roundtrip_preserves_content that imports a .pro
file, exports it, re-reads with the parser, and asserts song name,
groups, slides, translations, arrangements, and CCLI metadata survive
the round-trip.
2026-03-02 23:02:30 +01:00
Thorsten Bus 04d271f96a style: apply Laravel Pint formatting across codebase
Auto-formatted by Laravel Pint (default Laravel preset): string
concatenation spacing, anonymous class brace placement, constructor
body shorthand, import ordering, and assertion indentation.
2026-03-02 23:02:03 +01:00