# Release Notes - Technical Details Internal companion to `RELEASE_NOTES.md`. Not for customers. - **Range:** `510ac48fb93da55364fb0498b42f424ca1b89a0b` → `728b92858c5b97d6d8da6d435b7d2d34afd1081b` - **Generated:** 2026-09-24 13:36 UTC - **Merge requests:** 54 - **Commits:** 102 (0 without a merge request) ## Merge requests ### !2310 Service bundles - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2310 - Author: Michel - Labels: VDL - Commits: - `c2e20407` feat(horse): select button on mobile to start selecting horses - `5d0494ae` fix(horse): load the current stay only when needed and log errors - `8154486d` fix(horse): correct the location sort order comments - `ccf51650` fix(financial): type the service bundle request body as ProductTagWritable - `0f5505ee` fix(horse): only show rvo status and report for rvo authorized locations - `480b5f90` fix(horse): offer the rvo report after a multi-horse move - `f08d88dc` fix(horse): no unfinished activities warning for external horses - `075900c4` feat(horse): service bundles in the location section of the horse details - `45d844da` feat(horse): service tags and rvo status in the horse list - `65487418` feat(horse): gmail style selection via the avatar in the horse list - `63051790` feat(horse): move selected horses via the move dropdown and MoveHorseModal - `b0623bf9` feat(horse): multi-horse move and service bundles in MoveHorseModal - `d4fcb65a` feat(horse): rvo status and report actions in the location history tile - `d8b539ae` feat(financial): settings page in tabs, tabs component - `96a3f91d` feat(financial): product tags (service bundles) on billable services ### !2312 Breeding plans page - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2312 - Author: Michel - Labels: VDL - Commits: - `a0cb47c1` Added breading plan list page and details page ### !2364 fix(horses): stop showing raw contact/stable uid when it can't be resolved - use clear unkown names - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2364 - Author: Rein de Vries - Closes: [#329](https://gitlab.equinem.com/equinem/equiapp/-/work_items/329) Horse details tab shows UID for some team members - Commits: - `db00808e` fix(horses): stop showing raw contact/stable uid when it can't be resolved - use clear unkown names ### !2367 Feat/1227 bulk update horse - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2367 - Author: Rein de Vries - Closes: [#1227](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1227) Request: allow bulk edit of horses in the horse list - Commits: - `e2696888` fix(selection): select-all checkbox did nothing without totalCount - `7f903abd` feat(horse): added bulk move - `b785ca0b` feat(horse): added bulk edit on some simple fields - `9158b026` chore(claude): added more instructions ### !2377 chore(deleteAccount): do not log 400 error - its a user error not a fixable app error - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2377 - Author: Rein de Vries - Commits: - `e6f0457f` chore(deleteAccount): do not log 400 error - its a user error not a fixable app error ### !2379 chore(FertilityReport): added SWS filter - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2379 - Author: Rein de Vries - Closes: [#1645](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1645) Add 'SWS' filter to fertility report - Commits: - `4e37474d` chore(FertilityReport): added SWS filter ### !2380 chore(report): show the deployment report only for BP - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2380 - Author: Rein de Vries - Commits: - `34174c5c` chore(report): show the deployment report only for BP ### !2381 fix(reports): show income/expense chart by default - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2381 - Author: Rein de Vries - Commits: - `3d2b1488` feat(reports): remove the 'show chart' filter - `6eed083a` feat(reports): filter income/expense report by horse and/or contact - `85fe8bce` feat(reports): add Total column to income/expense report - `0b57ba88` fix(reports): show income/expense chart by default ### !2382 chore(report): make the grouped report sortable - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2382 - Author: Rein de Vries - Commits: - `0a494474` chore(report): make the grouped report sortable ### !2383 Chore/fead report fixes - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2383 - Author: Rein de Vries - Commits: - `790e1923` chore(report): show active filters for the feed report - `360dbfe8` chore(report): added cost toggle for the feed report - `b4ea4253` feat(feed): added average\_feed\_price in the feed type setting modal - `2464ca0a` chore(feedSetting): show the avarage price in the table of types ### !2384 chore(report): reorder list - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2384 - Author: Rein de Vries - Commits: - `a9581af2` chore(report): reorder list ### !2385 chore(menu): enable report menu - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2385 - Author: Rein de Vries - Commits: - `ce0829ec` chore(menu): enable report menu ### !2386 feat(invoice): integrate move Horse when a horse sale item is created - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2386 - Author: Rein de Vries - Commits: - `b6653adc` chore(toInvoice): disable horse sale - `54277329` chore(invoice): when moving an horse via sale, prefill the destination if possible - `1801554b` chore(invoice): make sure a horse sale can be for just one horse on the invoice - `e4c39766` feat(invoice): integrate move Horse when a horse sale item is created ### !2387 Feat/demo data - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2387 - Author: Rein de Vries - Closes: [#1253](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1253) Upgrade the trial experience (collection of ideas) - Commits: - `3c22470a` refactor(signup): remove dead code - `2d8b205d` fix(signup): image was not resizing correctly when the content is higher - `130e36d1` feat(signup): added checkbox for demo content (default = true) ### !2388 ci: added release-notes stage and added production deployment with this need - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2388 - Author: Rein de Vries - Commits: - `028c5d48` ci: added release-notes stage and added production deployment with this need ### !2389 Remove vercel dependencies - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2389 - Author: Michel - Commits: - `a71e393f` Remove vercel dependencies ### !2390 feat(organization): added fallback and preferred languages fields - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2390 - Author: Rein de Vries - Closes: [#1661](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1661) shop: added invoice language update - Commits: - `6f212abb` chore(invoice): translate the invoice language to the actual name in the meta tabel next to the invoice - `b485121a` chore: sync language list with the available languages from the locale repo - `b32a60a7` fix(invoice): remove setting the invoice language as that is obsolete now - `0c635d57` feat(organization): add available and fallback invoice language settings ### !2392 fix(order-wizard): stop re-logging handled 400s to Bugsink - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2392 - Author: Rein de Vries - Commits: - `56561341` fix(order): stop re-logging handled 400s to Bugsink ### !2393 fix(api): parse index-wrapped field errors from bulk endpoints - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2393 - Author: Rein de Vries - Commits: - `3a268d0f` fix(api): parse index-wrapped field errors from bulk endpoints ### !2394 chore: update OpenApi - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2394 - Author: Rein de Vries - Commits: - `ef83ffda` chore: update OpenApi ### !2395 fix(auth): sync rotated refresh token across tabs to prevent logout - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2395 - Author: Rein de Vries - Closes: [#1713](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1713) Opening a 2nd browser tab logs out the 1st tab - Commits: - `5aba0bd2` fix(auth): sync rotated refresh token across tabs to prevent logout ### !2396 chore(invoice): allow finalizing without a valid payment mandate - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2396 - Author: Rein de Vries - Closes: [#1709](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1709) Offer "finalize and send anyway" when the invoice has no valid payment mandate - Commits: - `87c428a2` chore(invoice): allow finalizing without a valid payment mandate ### !2397 fix: guard against missing url/fields in S3 presign response - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2397 - Author: Rein de Vries - Closes: [#1714](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1714) Profile avatar upload crashes with "Cannot convert undefined or null to object" when S3 presign response is empty - Commits: - `e5d6049b` fix: guard against missing url/fields in S3 presign response ### !2398 chore(careHorseForm): do not log cancel error - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2398 - Author: Rein de Vries - Commits: - `f34adbf8` chore(careHorseForm): do not log cancel error ### !2399 chore(apiParser): support non index array - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2399 - Author: Rein de Vries - Commits: - `c7cd1f10` fix(apiParser): surface nested \_\_all\_\_ row errors as non-field errors ### !2400 fix: stop double-logging already-handled API errors to Bugsink - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2400 - Author: Rein de Vries - Commits: - `88de1abf` fix: stop double-logging already-handled API errors to Bugsink ### !2401 chore: update OpenAPi - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2401 - Author: Rein de Vries - Commits: - `610c74e7` chore: adapt to OpenApi changes - `d5843a6f` chore: update OpenAPi ### !2403 fix(activities): show horse name in unassigned column of day view - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2403 - Author: Michel - Commits: - `0bc55ee4` fix(activities): show horse name in unassigned column of day view ### !2404 fix(planning): show tasks with a stable in action list - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2404 - Author: Michel - Closes: [#1711](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1711) Task not visible in action list - Commits: - `9da640cb` fix(planning): show tasks with a stable in action list ### !2405 fix(products): send current\_price\_currency to backend, clarify upfront payment currency - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2405 - Author: Rein de Vries - Closes: [#347](https://gitlab.equinem.com/equinem/equiapp/-/work_items/347) Currency support improvements (backlog) - Commits: - `74dee026` fix(products): send current\_price\_currency to backend, clarify upfront payment currency ### !2406 fix: upgrade react-router-dom to 6.30.6 for open-redirect advisories - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2406 - Author: Michel - Commits: - `24a09d24` fix: upgrade react-router-dom to 6.30.6 for open-redirect advisories ### !2407 feat(horse): show location history tile as a timeline - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2407 - Author: Rein de Vries - Closes: [#363](https://gitlab.equinem.com/equinem/equiapp/-/work_items/363) Show location history in horse details more like a timeline - Commits: - `28828309` feat(horse): show location history tile as a timeline - `4b648ba5` chore: update Claude.md with commit instructions ### !2408 fix: generate S3 key uuids with node:crypto instead of the uuid package - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2408 - Author: Michel - Commits: - `f5ff8e66` fix: generate S3 key uuids with node:crypto instead of the uuid package ### !2409 feat(contacts): enhanced contact merger - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2409 - Author: Rein de Vries - Closes: [#1307](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1307) Enhanced contact merge and support Horse Merge, [#1540](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1540) Duplicate merger shows 'hidden' contact as primary - Commits: - `28100ca7` fix(contacts): confirm merge before saving duplicate primary contact - `84576b4a` feat(contacts): move duplicate merge to dedicated pages with per-field conflict picker ### !2410 feat(order): added mare and stallion filter - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2410 - Author: Rein de Vries - Closes: [#369](https://gitlab.equinem.com/equinem/equiapp/-/work_items/369) Bestelpagina lijst filteren op hengst - Commits: - `c49043a3` feat(order): added mare filter - `4824167d` feat(order): added stallion filter ### !2412 fix(api): surface API errors for fields not present in the form's own schema - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2412 - Author: Rein de Vries - Commits: - `cab0b69d` fix(api): surface API errors for fields not present in the form's own schema ### !2413 fix(invitation): show organisation name in accept-invitation page title - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2413 - Author: Rein de Vries - Closes: [#375](https://gitlab.equinem.com/equinem/equiapp/-/work_items/375) Text "Uitnodigingsverzoek" moet worden "Uitnodiging voor {organisatie}" op de accepteer uitnodiging pagina - Commits: - `9a22af42` fix(invitation): show organisation name in accept-invitation page title ### !2414 chore: npm audit fix (non-breaking advisories only) - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2414 - Author: Michel - Commits: - `dd1751b2` chore: npm audit fix (non-breaking advisories only) ### !2415 fixes: Stal Hendrix - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2415 - Author: Rein de Vries - Commits: - `4b9d5953` fix(webshop): hide pay-order button while a payment is pending - `4e50e842` feat(webshop): require UELN when adding a mare via the client portal - `e901e060` fix(breeding): label order item quantity as its own key instead of reusing 'amount' ### !2416 fix(integrations): make machtiging\_rvo\_gegeven the leading RvO connection signal - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2416 - Author: Michel - Commits: - `36f668de` fix(integrations): make machtiging\_rvo\_gegeven the leading RvO connection signal ### !2418 fix(products): stop overwriting a product's drifted currency, add inline fix - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2418 - Author: Rein de Vries - Commits: - `e93d4733` fix(products): stop overwriting a product's drifted currency, add inline fix ### !2419 feat(activities): split action list into List and Day (staff tile) views - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2419 - Author: Michel - Commits: - `75fb5b92` fix(activities): bump Day view tile grid to 4/5 cols at xl/2xl - `e07fc218` fix(menu): hide Day view from the menu on mobile screens - `17609531` fix(activities): make Day view tile grid responsive - `7c0bc786` fix(activities): polish unassigned-by-type tiles and rename Day route - `da86a12d` feat(activities): split unassigned staff group by activity type - `26664034` fix(activities): use sibling route for Day view to avoid menu highlight bleed - `4d0146a2` feat(activities): split action list into List and Day (staff tile) views ### !2420 feat(horse): show feedschema on the horse detail page - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2420 - Author: Rein de Vries - Closes: [#466](https://gitlab.equinem.com/equinem/equiapp/-/work_items/466) Tegeltje met huidig voer in paard profiel - Commits: - `a7ccdc85` feat(horse): show feedschema on the horse detail page ### !2422 feat(feed): restrict feed type average price to admins - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2422 - Author: Rein de Vries - Commits: - `7199fe08` feat(feed): restrict feed type average price to admins ### !2423 fix(order): hide service contract orders from semen orders list - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2423 - Author: Rein de Vries - Closes: [#526](https://gitlab.equinem.com/equinem/equiapp/-/work_items/526) All order types are shown in semen orders list, [#606](https://gitlab.equinem.com/equinem/equiapp/-/work_items/606) orders/supplied endpoint should have a new filter to filter out the service\_contracts - Commits: - `459c2057` fix(order): hide service contract orders from semen orders list ### !2424 fix(planning): clip swipe animation so text doesn't bleed into horse-name column - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2424 - Author: Rein de Vries - Closes: [#537](https://gitlab.equinem.com/equinem/equiapp/-/work_items/537) Horizontal scrolling glitch on feed and care - Commits: - `c2b7dc41` fix(permissions): clip swipe animation so text doesn't bleed into label column - `76973714` fix(planning): clip swipe animation so text doesn't bleed into horse-name column ### !2425 fix(sidebar): measure submenu height after commit instead of during render - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2425 - Author: Rein de Vries - Closes: [#1718](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1718) Sidebar submenu overlaps neighboring item on first page load - Commits: - `fd43e7e7` fix(sidebar): measure submenu height after commit instead of during render ### !2426 fix(shop-settings): trim trailing zero decimals on cost fields - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2426 - Author: Rein de Vries - Closes: [#1719](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1719) Cost field shows incorrect value (10,00000) in shop settings - Commits: - `1f0e271e` fix(shop-settings): trim trailing zero decimals on cost fields ### !2427 fix(subscription): show estimated horse cost for accounts without a service contract yet - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2427 - Author: Rein de Vries - Closes: [#616](https://gitlab.equinem.com/equinem/equiapp/-/work_items/616) web.equinem user purchasing subscription doesnt get horse count - Commits: - `ffc8077d` fix(subscription): show estimated horse cost for accounts without a service contract yet ### !2428 fix(companies): refresh org companies after save to fix stale invoice letterhead address - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2428 - Author: Rein de Vries - Closes: [#543](https://gitlab.equinem.com/equinem/equiapp/-/work_items/543) Invoices: change in stable address is not immediately visible in concept invoices - Commits: - `4aa4a356` fix(companies): refresh org companies after save to fix stale invoice letterhead address ### !2429 chore: update OpenApi & show gantt chart also when transpas is enabled - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2429 - Author: Rein de Vries - Commits: - `6ee55b04` feat(menu): show gantt chart also when transpas is enabled - `abc196dd` chore: Adapt to OpenApi changes - `987033cd` chore: update OpenApi ### !2430 fix(activities): catch background reload error after quick save - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2430 - Author: Rein de Vries - Closes: [#1721](https://gitlab.equinem.com/equinem/equiapp/-/work_items/1721) Silent error when refreshing calendar after creating a quick reservation - Commits: - `39664529` fix(activities): catch background reload error after quick save ### !2431 Fix/breeding plans mobile - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2431 - Author: Michel - Commits: - `d8a61063` fix(breeding): show tile border on related orders and cycle checks - `7dadcbb2` fix(breeding): compact mobile breeding plan rows without horizontal overflow ### !2432 chore(duplicateContacts): more UI enhancements to distinct the primary contact - Merge request: https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2432 - Author: Rein de Vries - Commits: - `26f839c1` chore(duplicateContacts): more UI enhancements to distinct the primary contact - `6e3e09f4` chore(duplicateList): show no result bar in case of no results ## Left out of the customer release notes OpenAPI schema refreshes and other changes with no customer-visible effect. - !2394 chore: update OpenApi (https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2394) - !2401 chore: update OpenAPi (https://gitlab.equinem.com/equinem/equiapp/-/merge_requests/2401)