Changelog — July 13, 2026
Studio custom pricing categories launched on the Tarifs page, plus critical fixes for the client duplicate-merge flow, search performance, and a missing production migration.
Release
v1.57.0✨ New Features
- Studio Custom Pricing Categories — Studios can now create, rename, rescope (retoucher-only, studio-only, or shared), and delete custom price categories alongside the fixed retouching categories. A new
StudioPricingCategorymodel backs this, and thecategoryfield on pricing types/inputs has been relaxed from theRetouchingCategoryenum toStringto support arbitrary category ids. The pricing tables have been reworked to auto-save per-cell (no manual Save button), merged into a single scrollable table, and now support comparing multiple retouchers side-by-side with best-cost highlighting.#785
🐛 Bug Fixes
-
Missing
ClientPricingmigration (production-breaking) — TheClientPricingtable shipped in the Prisma schema without a migration, causingmergeOrganizations, pricing, and VAT resolvers to crash on databases provisioned viaprisma migrate deploy. Added20260710170000_add_client_pricingwith idempotent DDL (CREATE TABLE IF NOT EXISTS+ guarded FKs) so it's a safe no-op on databases where the table was already created viadb push.#784 -
Website clients reappearing after deletion — The e-do booking poller resolved/created clients before the session idempotency check and had no organization tombstone, so a deleted
WEBSITEclient was recreated on every poll tick.resolveReservationClientnow accepts anallowCreateflag, and the poller passesallowCreate: falsewhen aStudioSessionalready exists for the reservation, preventing deleted clients from being re-materialized.#784 -
Client search lag — Client-side search across ~2 000 rows re-rendered ~50 un-memoized rows per keystroke, each mounting a 7-hook actions hook and 3 Radix dialogs. Fixed by lazy-mounting the row actions menu on first open, wrapping
ClientRowinReact.memo, and memoizingsetOpenwithuseCallback.#784
♻️ Refactoring & Technical Improvements
- Duplicate-merge comparison sheet redesign — Replaced the old duplicate-comparison UI with a minimalist side sheet showing suspected-duplicate clients in a per-column layout with matched-reason highlighting and a keep-oldest default. The "à conserver" selector now uses the app's selectable-card pattern, and the duplicate list was moved into a collapsed accordion with names joined via
Intl.ListFormat.#784