etouch
Sign in
Back to changelog
by theodaguier

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.

#feature#bugfix#refactor#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 StudioPricingCategory model backs this, and the category field on pricing types/inputs has been relaxed from the RetouchingCategory enum to String to 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 ClientPricing migration (production-breaking) — The ClientPricing table shipped in the Prisma schema without a migration, causing mergeOrganizations, pricing, and VAT resolvers to crash on databases provisioned via prisma migrate deploy. Added 20260710170000_add_client_pricing with idempotent DDL (CREATE TABLE IF NOT EXISTS + guarded FKs) so it's a safe no-op on databases where the table was already created via db 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 WEBSITE client was recreated on every poll tick. resolveReservationClient now accepts an allowCreate flag, and the poller passes allowCreate: false when a StudioSession already 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 ClientRow in React.memo, and memoizing setOpen with useCallback. #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