v2.2.0
Added
-
Portuguese (pt-PT) translation. The fourth UI language after
Spanish, English and French. Ships the ~2,340-key core locale plus a
pt.jsonfor each of the eleven module layers, so every screen the
modules contribute is covered too, and the language appears in
Settings → Account → Language with no further configuration. Patient
communications can also be switched to Portuguese: the clinic-wide
communications language acceptsptand the full set of transactional
email templates (appointment confirmation / reminder / cancellation,
quote sent / accepted, welcome, morning digest, Verifactu alerts) is
translated. Nuxt UI's ownptlocale is wired in so date pickers and
built-in component strings follow. Backend catalog-name resolution
gained aptfallback, so treatments named in Portuguese resolve on
invoices, plans, the timeline and the agent tools rather than silently
falling back to the internal code.Not included: the user manual and the demo seed data stay on
es/en/fr, matching how French shipped.
Fixed
-
Multi-session treatments were charged double. Completing the last
step of a multi-session treatment (e.g. an implant with surgery,
abutment and crown steps) re-recorded the full parent price on top of
the amounts already charged per session, so a 1,100 € treatment showed
as 2,200 € owed. Each session now books only its own amount and the
total always equals the sum of the sessions. The reverse flow is also
covered: marking the treatment performed from the odontogram charges
it once in full and auto-cancels its pending sessions. Upgrading
repairs affected ledgers automatically — the migration removes the
duplicate charges this bug created; no manual action needed. -
Published images were
amd64only, sodocker compose upfailed at the
very first command on Apple Silicon and on ARM VPS instances (Hetzner's
CAX line, the cheapest in Europe and popular with self-hosters) with a
bareno matching manifest for linux/arm64/v8. Each architecture now
builds on its own native runner and a merge step publishes one manifest
list per image, verified to carry both before the release is cut.
Install
curl -O https://raw.githubusercontent.com/martinezsalmeron/dentalpin/main/docker-compose.prod.yml
curl -O https://raw.githubusercontent.com/martinezsalmeron/dentalpin/main/Caddyfile
curl -o .env https://raw.githubusercontent.com/martinezsalmeron/dentalpin/main/.env.prod.example
# set PUBLIC_URL, POSTGRES_PASSWORD, SECRET_KEY
# and DENTALPIN_VERSION=2.2.0 to pin this release, then:
docker compose -f docker-compose.prod.yml up -dImages (amd64 + arm64): ghcr.io/martinezsalmeron/dentalpin-backend:2.2.0 · ghcr.io/martinezsalmeron/dentalpin-frontend:2.2.0
What's Changed
- fix(release): publish arm64 images alongside amd64 by @martinezsalmeron in #121
- fix(release): manifest check failed on a manifest that was correct by @martinezsalmeron in #122
- ci: watch that published images stay anonymously pullable by @martinezsalmeron in #123
- fix(ci): health alert jobs could not find the repository by @martinezsalmeron in #124
- feat(i18n): add Portuguese translation by @martinezsalmeron in #125
- fix(budget): show the real API error, and every ISO 4217 currency by @martinezsalmeron in #148
- fix(ui): surface the server's message on every failed action by @martinezsalmeron in #152
- ci(lint): module-layer frontend code was never linted — wire it in and fix it by @martinezsalmeron in #150
- feat(auth): decouple "professional" from role + unlock plans with draft budgets by @martinezsalmeron in #151
Full Changelog: v2.1.0...v2.2.0