Changelog
Lịch sử cập nhật DentIQ. Phiên bản mới nhất ở trên.
v1.0.2 — 2026-06-03 (Vị trí chuyên môn → dropdown)
Changed
- Dropdown chọn bác sĩ / phụ tá nay lọc theo vị trí chuyên môn (StaffPosition) thay vì vai trò truy cập (role). "Chọn bác sĩ" = DENTIST; "Chọn phụ tá" = DENTIST + ASSISTANT + HYGIENIST + TECHNICIAN. Lý do: role được cấu hình tự do theo phòng khám nên không ổn định để xác định "ai là bác sĩ".
- Áp dụng cho mọi dropdown: lễ tân, chẩn đoán, lịch hẹn, kê đơn, mở visit, kế hoạch điều trị.
- Dropdown nhân viên luôn hiển thị mã số (staffCode) để phân biệt người trùng tên.
Added
- Mã số nhân viên (staffCode) phải duy nhất trong phòng khám — trùng mã báo lỗi 409 "Mã số nhân viên đã tồn tại".
- Form thêm/sửa nhân viên có mô tả dưới ô vị trí chuyên môn, giải thích vị trí quyết định dropdown + hoa hồng.
Fixed
- Trường vị trí chuyên môn trong form thêm/sửa nhân viên trước đây không được lưu — nay đã gửi đúng lên server.
v1.0.1 — 2026-06-01 (Staff Compensation)
Added
- Staff Compensation system: replaces "Doctor earning" with position-aware, multi-performer model
- Staff positions (StaffPosition): DENTIST, ASSISTANT, HYGIENIST, TECHNICIAN, OTHER — controls automatic commission rates
- Multi-performer per stage: primary operator + assistants with weight percent (tỉ trọng) to split commission
- Commission rate resolution: override (staff × service) → position rate (service × position) → none
- Permission treatment_plan.execute (56th permission code): separate from treatment_plan.manage for stage completion
- New ASSISTANT (Phụ tá) default role: includes treatment_plan.execute, visit.manage, diagnosis.read, document.print, earnings.read
Changed
- Doctor Earning → Staff Compensation / Thu nhập nhân sự (generalized terminology)
- DOCTOR role: now includes treatment_plan.execute to complete stages
- Earnings.read: non-admin users see only their own ledger (CI-08)
- Help site updated: doctor-earnings.html → Staff Compensation content with multi-performer examples
Fixed
- Commission calculation for multi-performer stages: weight % now applied correctly in ledger
- Permission precedence: override > position rate > none (idempotent rule resolution)
v1.0.0 — 2026-05-28 (Initial Release)
Added
- Patient 360 hub: unified timeline, multi-tab clinical & financial context
- Visit management: create visit, record diagnosis, tooth chart with ICD-11 codes
- Treatment plan: multi-stage execution, doctor assignment, warranty tracking
- Payment & cash: payment recording, cash session reconciliation, e-invoice integration
- E-invoice: VNPT, MISA, Viettel provider support (sandbox + production)
- Customer Care queue: auto-task generation for unaccepted plan, no-show, outstanding balance
- Doctor earning: commission calculation per stage completion, adjustment per month
- Lab order: work order creation, status tracking, provider SMS/email integration
- Appointment & Scheduler: calendar + table view, branch-aware operating hours
- User management: role-based access control (clinic scope), permission matrix, audit log
- Multi-clinic: tenant isolation, branch scope, cross-branch patient timeline (no cutoff)
- Reporting: revenue, no-show rate, treatment completion, doctor performance, cash reconciliation
- Data export: patient list, appointment, payment, e-invoice export to Excel
- Help system: in-app help, inline tooltips, documentation site
- Mobile responsive: full functionality on iPad/tablet, basic support for phone
Changed
- UI localization: full Vietnamese + English support, i18n keys in database (CI-11)
- API response shape: explicit DTO allowlists, no data leakage (CI-02, CI-08)
- Database: Prisma ORM with transaction locks for idempotency (CI-06)
- Cache invalidation: outbox-driven, outside transaction (CI-04)
- Job queue: BullMQ repeatable scheduler (multi-instance safe, CI-09)
Fixed
- Bootstrap clinic setup: fixed seed data role-permission mismatch vs run-demo.ts
- Patient import: dedupe by phone number, warn on duplicate before merge
- Visit-diagnosis link: historical diagnosis (visitId = null) now rendered correctly
- E-invoice retry: exponential backoff + max 3 retry on provider timeout
- Cash session: prevent edit after close (period lock enforcement)
- Permission redaction: "Data hidden…" shown on missing read, not fake zero (CI-02)
Known Issues
- OutboxProcessorService polling: BullMQ migration planned for v1.2 (currently uses bespoke FOR UPDATE SKIP LOCKED loop, documented exception per CI-09)
- Mobile print: Print bridge not optimized for small screens; browser print fallback recommended for phone
- Lab order SMS: Requires provider API key setup; sandbox mode uses mock SMS (not sent to real number)
- Dark mode: Not yet implemented; light mode only in v1.0
v1.1.0 — Planned (Q3 2026)
Planned Features
- Mobile app (iOS/Android) with offline sync support
- Advanced BI dashboard with custom report builder
- AI-powered diagnosis suggestion (beta)
- SMS/Zalo auto-notification for appointment reminders
- Pharmacy integration: inventory tracking + prescription auto-sync
- Dark mode support
- Keyboard shortcut command palette (⌘/)
v1.2.0 — Planned (Q4 2026)
Planned Improvements
- BullMQ migration for outbox processor (remove polling-based processor)
- Multi-language support: French, Spanish, Chinese
- SAML / SSO for Enterprise customers
- Advanced permission scoping (department-level ACL)
- Warranty claim workflow automation
Getting Help
For questions about a specific version, features, or bug reports:
- Check troubleshoot page for common issues
- Review FAQ for billing, compliance, integration questions
- Contact support: [email protected] (response < 2 hours, business hours)
- Feature request: [email protected]
Backward compatibility
DentIQ maintains API backward compatibility within major version (v1.x). Breaking changes only occur in major version bumps (v1 → v2). Deprecation notices are given 6 months in advance.