Commit Graph
55 Commits
Author SHA1 Message Date
frommeandClaude Opus 5 3221008f90 refactor: move the bulk export to its own /api/exports resource
/api/travels/{dateCode} accepts an arbitrary string, so /api/travels/export
shared a namespace with every date code and stayed reachable only because
byCode() carried a negative lookahead ruling that one string out. Nothing
in the URL announced the constraint, and getting it wrong mis-routed
silently: the first attempt widened the segment to `.+` and swallowed
/api/travels/{dateId}/{hotelId}/{dateTo}/availability whole.

/api/exports never takes a parameterised segment, the same shape as
/api/contingents, so the collision stops existing instead of being
guarded. TravelController returns byte-for-byte to its state on master,
lookahead included, and the export moves to its own resource controller.

The routing test now also asserts that nothing is reintroduced under the
date code namespace.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-29 14:23:36 +02:00
frommeandClaude Opus 5 b27639c7fa fix: keep the travel date code to a single path segment
The dateCode requirement added with the export route was `.+`, which
replaces Symfony's default `[^/]+` and lets the segment span slashes.
`/api/travels/{dateId}/{hotelId}/{dateTo}/availability` was then matched
by byCode() -- declared above it -- with dateCode swallowing all four
segments, so availability answered 404 "Not found" instead of reaching
the upstream call.

Adds a routing test that reflects the controller's own attributes, so
both the declaration order and the segment class stay guarded. Neither
fails loudly on its own: a path falling through to the wrong route reads
like an endpoint that exists and holds no data.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-29 14:19:24 +02:00
frommeandClaude Opus 5 c5685e6d7c feat: add paginated travel export endpoint for the teamer app
GET /api/travels/export flattens the XML export into one row per travel
date x hotel with its pickups resolved, so the Teamer app can import the
disposition in one walk instead of fanning out over /api/travels.

Built from the XML file map, not travel_snapshot: the snapshot table sits
at this grain but refreshes on its own schedule, while the loaders share
the bpn.cache pool under the xml-sync tag. That is what makes /api/hotels,
/api/pickups and this export move together for free.

Each Ziel_*.xml is walked once and TravelParser::getPickups() does the
zeit parsing, which buys both zeit shapes and adjustOvernightTimes() --
a time-only 02:15 listed after a 23:59 rolls onto the next calendar day.
Pickups join against PickupLoader::loadAll() rather than
patchPickupsDetails(), which sorts: the contract is source order.

The whole assembled export is cached, not a page, so skipped, total and
pickupsWithoutMasterData are whole-export figures identical on every page
and a consumer can abort after the first one. Errors stay real status
codes; the builder is deliberately not wrapped in a catch that would
answer 200 with an error body the way hotelAvailability() does.

The route is declared before api_travel_single_code and that route grows
a requirement, or /api/travels/export resolves to byCode('export') and
404s as though the endpoint existed with no data.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-29 12:13:55 +02:00
fromme d0e7ba017c fix: resync room selections with travel data before step 2 2026-09-29 10:59:13 +02:00
fromme 29f295abf6 feat: duplicate an accommodation booking into a new draft
addresses #869f6z44f
2026-09-28 08:55:01 +02:00
fromme 2aa98b81fe feat: dedicated login page for oauth2 logins 2026-09-27 13:43:17 +02:00
fromme 56adf72d12 fix: refuse implausible accommodation booking prices 2026-09-26 15:39:04 +02:00
fromme bad916cfb7 feat: identify accounts by a uuid in the oauth2 sub claim 2026-09-23 15:17:09 +02:00
fromme ab7d00b35d feat: emit team admin role in userinfo claims when applicable 2026-09-21 11:43:36 +02:00
fromme 00637042e2 chore: adjust tests to changed role labels 2026-09-21 10:02:29 +02:00
fromme ec83ad598f feat: identify the authenticated account in the userinfo claims 2026-09-19 10:54:06 +02:00
fromme 540cd8eeb7 feat: reserve administrative roles for staff email addresses 2026-09-17 18:13:52 +02:00
fromme 12fe4d8e15 feat: offer contact validation flow 2026-09-16 10:40:01 +02:00
fromme f8ff4b82a3 feat: replace custom discount with absolute value in favor of percentage 2026-09-08 17:11:00 +02:00
fromme 8443dae5ad feat: additional custom discount applied to total price 2026-09-08 15:29:00 +02:00
Björn Fromme 81b724c11a fix: false draft-restored message 2026-08-31 09:31:00 +02:00
Björn Fromme bfad61f1dd feat: upgrade phpunit to 12.5 2026-08-31 09:31:00 +02:00
Björn Fromme 010cfe56b2 feat: upgrade project to symfony 7.4 2026-08-31 09:03:44 +02:00
Björn Fromme 80d734e7d6 feat: derive calendar date range from price configurations 2026-08-26 13:32:25 +02:00
Björn Fromme 578a21d327 fix: stop mutating booking state on edit-mode page views 2026-08-24 17:13:19 +02:00
Björn Fromme c9c28792e5 fix: resolve stale dependent selections after booking family insurance 2026-08-24 16:58:09 +02:00
Björn Fromme 48db290625 feat: manually create customer access link for offer and update status
addresses #869eea8d7
2026-08-24 09:19:16 +02:00
Björn Fromme 7c5f6dd5ef feat: create ClickUp task after confirming accommodation booking 2026-08-20 17:56:29 +02:00
Björn Fromme ef439f6faf feat: re-generate access links for bookings when sent via email 2026-08-20 14:21:02 +02:00
Björn Fromme 98a303e941 feat: delete accommodation bookings in draft 2026-08-20 12:39:45 +02:00
Björn Fromme 3db1850e4f feat: edit selected accommodation of bookings in draft 2026-08-20 12:34:44 +02:00
Björn Fromme 351fbab498 feat: improved contingents api performance with db backed snapshots 2026-08-20 11:46:03 +02:00
Björn Fromme d5f9f4ef10 chore: adopt namespace pattern for accommodation booking controllers 2026-08-19 17:07:57 +02:00
Björn Fromme 8617bf6c86 fix: prevent generating offer links while booking is in draft 2026-08-19 13:00:43 +02:00
Björn Fromme 0c667d6b69 feat: align role assignment logic with myep-team 2026-08-19 12:14:09 +02:00
Björn Fromme 5a3957e143 feat: refactored accommodation booking status model 2026-08-19 11:46:52 +02:00
Björn Fromme 2d7a02341d feat: booking details pdf 2026-08-18 14:26:24 +02:00
Björn Fromme ef24c9a616 fix: streamlined discount display in all breakdowns 2026-08-18 13:04:33 +02:00
Björn Fromme 8dee65d0dc feat: additional confirmation cycle and status for groups inquiries 2026-08-18 12:48:17 +02:00
Björn Fromme a5d97f1206 feat: enable entering additional remarks in offer confirmation 2026-08-17 15:30:17 +02:00
Björn Fromme 70a10c4dba fix: make email readonly in personal data form to prevent user lockout 2026-08-11 18:08:48 +02:00
Björn Fromme aa8fa5c1b2 feat: accommodation booking type and status as dedicated properties 2026-08-06 08:52:09 +02:00
Björn Fromme 736128476b feat: assignable managers for accommodation bookings 2026-08-05 13:45:33 +02:00
Björn Fromme 8e4afc0813 feat: dedicated terms urls per country for accommodation bookings 2026-08-05 12:38:34 +02:00
Björn Fromme 2c381ee741 feat: additional status 2026-08-04 18:09:40 +02:00
Björn Fromme 8ff13614d2 fix: treat dates without price as unavailable 2026-08-04 11:29:58 +02:00
Björn Fromme 9d2aa11fdb feat: groups price calculator admin crud, booking/offer flow and api 2026-08-03 15:25:10 +02:00
Björn Fromme 0ea43d0c6b fix: correct edit reload dirty-state 2026-07-10 14:33:09 +02:00
Björn Fromme 99b6876ce2 fix: ensure mandatory services are preselected in edit mode 2026-07-10 14:33:09 +02:00
Björn Fromme b41b19d4c6 feat: pre-flight check of agency bookings
addresses #869bqxr4q
2026-07-10 14:33:09 +02:00
Björn Fromme b2fccae431 chore: remote obsolete contingents-related plumbing 2026-06-11 16:19:14 +02:00
Björn Fromme 7dfbc06bd1 feat: only handle unsubscribe events for configured list ids 2026-05-13 08:30:22 +02:00
Björn Fromme 1fa8f88a6d chore: code cleanup with rector and php-cs-fixer 2026-05-04 17:20:01 +02:00
Björn Fromme 68900dd4ea fix: use plain password in configuration for MailJet webhook url 2026-04-30 11:44:17 +02:00
Björn Fromme e4ef2f7adc feat: MailJet list handling with DOI, webhook receiver and API endpoint
addresses #869cut134
2026-04-29 09:51:57 +02:00