Skip to content

4.11.0 dev - #274

Merged
developeregrem merged 33 commits into
masterfrom
4.11.0-dev
Aug 22, 2026
Merged

4.11.0 dev#274
developeregrem merged 33 commits into
masterfrom
4.11.0-dev

Conversation

@developeregrem

Copy link
Copy Markdown
Owner

No description provided.

…vation overview, make reservations have rounded corners
… token can be used for calendar requests as well in basic auth way
Workflow mail actions can now attach PDF templates and invoices. The new
WorkflowAttachmentResolver centralises rendering, filenames and the
correspondence entries for send_template_email, send_general_email and
send_invoice_email.

- new attachment_list schema type with repeatable rows in the form
- invoice attachment as all (excluding cancelled) or unpaid only
- new condition "invoice exists" for reservation triggers
- send_template_email now records correspondence for invoice based mails too
…pover, fixed category image preview position
- invoice numbers follow a pattern: global default plus per-subsidiary override,
  empty keeps the previous "increment the last number" behaviour
- invoices carry their subsidiary now, existing ones backfilled where unambiguous
- invoice settings can be assigned to a subsidiary; the misleading "active" flag
  became a scope selector (default / branch / not in use)
- bank import builds its matcher from the configured ranges instead of three
  sample numbers, settings tab is read-only
- duplicate invoice numbers are rejected, fixed crash in the change-number dialog
Move request parsing into PublicBookingRequestMapper and the $view assembly,
including the error-recovery path, into PublicBookingViewModelFactory. book()
shrinks from 272 to 93 lines and the unit tests now exercise the mapper's public
API instead of reflecting on controller privates.

Replace the untested DP knapsack in the public availability with a plain
min(available, requested rooms) cap. Consequence: a room type that cannot seat
the party stays listed, and an impossible pick is rejected by the existing
selection validation with a message the guest can act on.

Also: drop the undocumented guestCounts POST fallback, share one room-total
calculation between the price table and the preview, move the public bed
predicate to AvailabilityService (its semantics differ from isRoomAvailable(),
which a test now pins), and memoize OnlineBookingRestrictionService.
Step 2 now always quotes the list price and flags a differing rate per room type
via an info popover; the amount stays out of it, because which room a discounted
guest ends up in is decided one step later. The summary reports the adjustment as
its own line, worded like the invoice position. Direction is derived exactly,
except with minFullPayers set, where it depends on the allocation.
The "Storniert / No-Show" status was inserted with hardcoded German text
in a migration, so English installations showed German with no way to
correct it — the edit form is disabled for system statuses.

DisplayNameResolver derives the label from the immutable `code` at render
time (translation key `status.<code>`), falling back to the stored name
when a key has no translation. Existing installations benefit without any
data migration. Exposed to templates as the `display_name` Twig filter,
which also covers user-authored PDF and mail templates.
@developeregrem
developeregrem merged commit f51a9e7 into master Aug 22, 2026
10 checks passed
@developeregrem
developeregrem deleted the 4.11.0-dev branch August 22, 2026 12:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant