etouch
Connexion
Retour aux nouveautés
par Théo Daguier

Changelog — July 9, 2026

Major entity sheet UX rework, automated session creation from e-do reservations, Pennylane auto-sync, per-user notification preferences, and critical fixes to the reservation poller and Docker build pipeline.

#feature#bugfix#refactor#infrastructure

Release

v1.57.0

✨ New Features

  • App-wide Entity Sheets — All dedicated detail routes (/clients/$id, /guidelines/$id, /profile/$id, /studio/$id, /retouchers/$id) are replaced by a single EntitySheetProvider mounted at the dashboard root. Any entity name anywhere in the app is now clickable, opening a contextual sheet with imperative openers (openClient, openStudio, openRetoucher, openUser, openGuideline, openProduct, openMachine). Org sheets gain tabbed layouts (Details / Guidelines / Team / Projects / Sessions / Analytics / FTP) with action-card grids and redesigned create forms. #774

  • Per-user Email Notification Preferences — Org-scoped notification settings are replaced by a dedicated per-user NotificationPreference model, so a user's email choices follow them across organizations. Role-targeted transactional emails are now sent for each workflow step (studio import, retoucher assignment, client selection/validation, delivery, etc.), replacing the generic project-update email. Every notification email includes a one-click unsubscribe link. The email template system is redesigned around the app's Geist/neutral design tokens. #775

  • Automated Studio Sessions from e-do Reservations — A headless BullMQ poller (edo-booking-sync) now converts every new e-do reservation directly into a PLANNED StudioSession, matching or creating the client by SIREN/email and mapping plateaux to machines. The manual "confirm queue" / transform-dialog UI (web + mobile) and Acuity calendar surfacing are removed — reservations no longer need a human step to become sessions. E-do fetch/normalize and plateau-matching logic is extracted into @etouch/shared, shared between API resolvers and the worker. #761

  • Pennylane Auto-Sync — A repeatable BullMQ job (pennylane-sync) now upserts Pennylane customers (as CLIENT organizations) and products (as StudioProducts) for every studio with the Pennylane integration, every 5 minutes — no manual import needed. Idempotent and safe on a schedule. #770

  • Website Source for Reservation-Created Clients — Clients auto-created by the reservation poller now carry a WEBSITE source tag (with badge + filter tab in the clients table) instead of SYSTEM, and their status is left null so the clients table shows the neutral "Invitation requise" badge rather than incorrectly implying an activated account. #768

  • Annotation Workspace Redesign — The annotation tools are reworked around a Frame.io-style click-to-comment pin system and a freehand stroke tool, replacing the old ellipse/arrow drawing tools. The sidebar becomes a flat comment list with inline edit/save/cancel, and the composer moves to an on-canvas inline editor anchored to the draft pin. #742

🐛 Bug Fixes

  • Session Arrival Hour — Auto-created sessions all showed 02:00 (summer) / 01:00 (winter) because startedAt was derived from a date-only preferredDate parsed as UTC midnight. The arrival hour is now correctly applied using Europe/Paris timezone-aware conversion, and the poller self-heals previously bugged rows on the next tick. #769

  • Forward-Looking Reservation Poll — The e-do poller only fetched reservations in the past 30 days, so all future bookings (the normal case) were dropped and never became sessions. A 365-day lookahead window is added, with an increased fetch limit of 500 rows. #767

  • etouch-Created Reservations Now Convert — The poller was skipping every booking with source === "etouch" under the false assumption they already had a session flow. In production, all reservations go through etouch's own flow, so zero sessions were being created. The skip is removed; idempotency is enforced via externalReservationId. #764

  • Docker Build OOM — The build script's inline NODE_OPTIONS (4096 MB) was silently overriding the Dockerfile's ENV (6144 MB), causing OOM on the recharts/exceljs/jspdf/project-details bundle. The heap sizes are now synchronized. #763

  • Backend Proxy EncodingAccept-Encoding is now pinned to gzip/deflate/br and content-encoding/content-length headers are only stripped when fetch() actually decoded the body, preventing corrupted responses from unexpected encodings like zstd. e73a279

♻️ Refactoring & Technical Improvements

  • Migration Boot Hardening — The Docker entrypoint's migration step could silently break out of its retry loop and start the server on an un-migrated schema when hitting a Postgres advisory-lock timeout (common during rolling deploys). The entrypoint now treats lock timeouts as transient failures, retries up to 30 times, and exits non-zero when exhausted so the orchestrator restarts the container rather than serving a stale schema. #766

  • Shared E-do Logic — E-do fetch/normalize and plateau-matching logic extracted into @etouch/shared, eliminating duplication between API resolvers and the new worker poller. #761

📦 Dependencies & Infrastructure

  • Docker Build Heap — Increased the build-time Node.js heap to 6144 MB (from 4096 MB) to match CI and prevent OOM during Nitro SSR bundling of large chunks. 463ec25
  • shadcn Skill Vendored — shadcn agent skill files (docs, rules, CLI reference, assets) are vendored into the repo for in-repo AI-assisted development. e73a279