Vietnam Nails là tiệm nail của người Việt tại Phần Lan. Hệ thống chúng tôi xây dựng gồm web đặt lịch cho khách, ứng dụng di động Flutter và trang quản trị cho chủ tiệm, dùng chung một API. Khách đặt lịch bằng tiếng Phần Lan hoặc tiếng Anh và thấy giá bằng euro; chủ tiệm quản lý lịch hẹn, nhân viên, ví, voucher và bảng lương trên cùng một chỗ.
Bối cảnh bài toán
Một tiệm nail ở Phần Lan vận hành theo cách rất khác tiệm trong nước:
- Khách đặt lịch qua tin nhắn và điện thoại — giờ cao điểm không ai nghe máy, lịch ghi tay dễ trùng và sót
- Khách bản địa và khách người Việt dùng hai ngôn ngữ — giao diện tiếng Việt không dùng được cho khách Phần Lan, nhưng nhân viên vẫn cần đọc được
- Giá không đồng nhất — mỗi kỹ thuật viên có bậc tay nghề riêng, mỗi dịch vụ có nhiều lựa chọn cộng thêm (sơn gel, đắp bột, nail art) nên giá cuối cùng phụ thuộc người làm
- Hoa hồng và lương tính tay cuối kỳ — doanh thu trừ đi phần chủ tiệm, phần còn lại chia theo tỉ lệ của từng người
- Khách quên lịch — không có ai nhắc, mất doanh thu của khung giờ đã giữ
- Đang dùng phần mềm đặt lịch cũ (Timma) — danh mục dịch vụ, giá và thời lượng nằm bên đó, không muốn nhập lại từ đầu
Giải pháp đã xây dựng
Hệ thống có ba phần dùng chung một API:
| Thành phần | Dành cho | Chức năng chính |
|---|---|---|
| Web đặt lịch | Khách | Xem dịch vụ theo nhóm, giá theo từng kỹ thuật viên, chọn khung giờ trống thực tế, đặt lịch, nhận mã QR check-in, xem lịch sử đặt |
| Ứng dụng Flutter | Khách | Cùng chức năng đặt lịch trên Android, có thông báo và thanh toán trong ứng dụng |
| Trang quản trị | Chủ tiệm, lễ tân | Lịch hẹn theo ngày và theo nhân viên, chấm công bằng QR, ca làm việc, dịch vụ và bậc giá, voucher, nhắc nhở khách quay lại, đánh giá, chat, báo cáo, bảng lương |
Các nhóm chức năng đáng chú ý ở trang quản trị:
| Nhóm | Nội dung |
|---|---|
| Bán hàng | Lịch hẹn, check-in QR tại quầy, thu ngân, in bill, trạng thái đơn (đã xác nhận → đang làm → hoàn tất) |
| Nhân sự | Hồ sơ nhân viên, bậc tay nghề, ca làm việc theo tuần, dịch vụ mà từng người nhận làm, bảng lương và chia doanh thu cuối kỳ |
| Khách hàng | Tài khoản khách, ví điện tử, điểm tích luỹ, hạng thành viên, voucher và khuyến mãi, nhắc nhở quay lại, đánh giá sau dịch vụ |
| Vận hành | Cài đặt tiệm, nhóm dịch vụ, đồng bộ danh mục dịch vụ từ Timma, báo cáo doanh thu, xuất dữ liệu |
Điểm kỹ thuật đáng chú ý
- Giá theo kỹ thuật viên, không theo bảng giá chung — mỗi dịch vụ có giá gốc và giá riêng của từng người theo bậc tay nghề; khi khách chọn người làm, giá và thời lượng cập nhật ngay
- Một chỗ tính tiền dùng chung cho web, app và máy chủ — công thức giá, làm tròn và khuyến mãi nằm trong một gói dùng chung, nên web và app không bao giờ hiển thị hai con số khác nhau cho cùng một lịch hẹn
- Chống trùng lịch ở tầng máy chủ — khung giờ bị chặn theo nhân viên, cộng cả thời lượng dịch vụ chính và các dịch vụ cộng thêm, không phụ thuộc vào việc giao diện có tải lại hay không
- Song ngữ Phần Lan / Anh — chọn ngôn ngữ ở giao diện, lưu theo tài khoản để lần sau vào đúng ngôn ngữ đó
- Tiền tệ tính bằng euro, lưu bằng số nguyên cent — tránh sai số làm tròn khi cộng dồn doanh thu và chia lương
- Một API cho cả ba phần — web React, app Flutter và trang quản trị dùng chung endpoint, không có bản sao logic nào bị lệch
- Mang được dữ liệu từ Timma — đọc danh mục dịch vụ, giá và thời lượng từ hệ thống cũ để đối chiếu và ánh xạ sang dịch vụ mới, không phải nhập tay lại
Kết quả
- Khách tự đặt lịch 24/7 thay vì chờ nghe điện thoại; khung giờ trống hiển thị đúng người làm thật
- Lịch hẹn, ví, voucher và điểm tích luỹ nằm trong một tài khoản khách, có dữ liệu để mời khách quay lại
- Cuối kỳ chốt lương bằng một lần bấm thay vì dựng lại bảng tính tay
- Chủ tiệm nhìn được doanh thu theo ngày, theo nhân viên và theo dịch vụ
Công nghệ sử dụng
React 18 + TypeScript (Vite, shadcn/ui, Tailwind) · Express + Drizzle ORM · PostgreSQL · Flutter (Android) · một API dùng chung · Firebase Hosting cho web, Render cho máy chủ