Quasa Relax Spa & Wellness

Quasa kính chào quý khách

Toàn thể đội ngũ Quasa Relax Spa & Wellness

Toàn thể đội ngũ Quasa

Với tất cả tâm huyết và sự tận tâm, toàn thể đội ngũ Quasa Relax Spa & Wellness luôn sẵn sàng chào đón và đồng hành cùng quý khách trên hành trình chăm sóc sức khỏe, tìm lại sự cân bằng và bình yên trong cuộc sống.

Trao sức khỏe – Gửi bình yên

✦ Đặt lịch ngay tại QUASA

Cơ sở 1 · Nguyễn Trãi  ·  Cơ sở 2 · Ngô Mây

Xem hành trình 3 năm

Hành trình 3 năm

Lướt ngang để đi qua từng chặng đường của Quasa.

Thầy Mai Phong
Người thầy

Thầy Mai Phong

Quasa bắt đầu từ đôi bàn tay và tâm huyết của thầy Mai Phong. Nhiều người bị đau xương khớp, đau cổ vai gáy, thoát vị đĩa đệm đã tìm đến và thuyên giảm.

Một cơ sở nhỏ ở 07B Nguyễn Trãi
Khởi đầu

Một cơ sở nhỏ ở 07B Nguyễn Trãi

Sáu năm trước, Quasa chỉ là một không gian nhỏ với những chiếc ghế cam ấm áp và chén trà nóng mời khách.

Khách đến mỗi ngày một đông
Khởi đầu

Khách đến mỗi ngày một đông

Người ở lại chờ đến lượt, người hỏi thăm liệu trình. Quasa lớn dần bằng sự tin tưởng truyền miệng.

Xem kỹ từng liệu trình
Tin tưởng

Xem kỹ từng liệu trình

Khách cầm bảng dịch vụ, chọn cách chăm sóc phù hợp với cơ thể mình.

Tận tâm với từng người
Tin tưởng

Tận tâm với từng người

Mỗi người một tình trạng đau khác nhau, Quasa lắng nghe trước rồi mới trị liệu.

Xoa bóp và giác hơi
Tin tưởng

Xoa bóp và giác hơi

Kỹ thuật viên xoa bóp lưng, kết hợp giác hơi để giải tỏa cơ căng cứng.

Bạn bè kéo nhau đến
Lan tỏa

Bạn bè kéo nhau đến

Những nhóm bạn, những gia đình tìm đến Quasa cùng nhau để thư giãn và phục hồi.

Khách quốc tế cũng tìm đến
Lan tỏa

Khách quốc tế cũng tìm đến

Những vị khách từ nước ngoài ghé Quasa, ra về với nụ cười và những bó hoa nhỏ.

Niềm tin vượt biên giới
Lan tỏa

Niềm tin vượt biên giới

Trong nước hay nước ngoài, Quasa đều được nhiều người tin tưởng quay lại.

Bức tranh bốn mùa dưỡng sinh
Lan tỏa

Bức tranh bốn mùa dưỡng sinh

Bốn mùa xuân, hạ, thu, đông trên tường nhắc nhớ triết lý dưỡng sinh đông y của Quasa.

Những người đã trở thành bạn
Lan tỏa

Những người đã trở thành bạn

Sáu năm đủ để nhiều vị khách trở thành người quen, người thân của Quasa.

Những điều Quasa làm tốt nhất
Lan tỏa

Những điều Quasa làm tốt nhất

Massage trị liệu cơ, bấm huyệt giãn cơ, phục hồi đau mỏi, giảm đau nhức và thư giãn sâu.

Toàn thể đội ngũ Quasa
Cơ sở 2 · 03/10/2025

Toàn thể đội ngũ Quasa

Múa lân rộn ràng trước cửa, cả đội ngũ cùng chào đón một chặng đường mới.

Ngày 03/10/2025: Quasa cơ sở 2 ra đời
Cơ sở 2 · 03/10/2025

Ngày 03/10/2025: Quasa cơ sở 2 ra đời

Tại 256 Ngô Mây, Quasa mở thêm một không gian mới để đón tiếp quý khách chu đáo hơn.

Trị liệu bằng đôi bàn tay
Cơ sở 2 · 03/10/2025

Trị liệu bằng đôi bàn tay

Phòng trị liệu ánh vàng ấm, nơi từng thao tác đều hướng đến cổ vai gáy và sự thư giãn.

Kiểm tra cổ vai gáy
Cơ sở 2 · 03/10/2025

Kiểm tra cổ vai gáy

Nhìn, sờ, cảm nhận từng điểm đau rồi mới bắt đầu trị liệu.

Đội ngũ kỹ thuật viên
Cơ sở 2 · 03/10/2025

Đội ngũ kỹ thuật viên

Những kỹ thuật viên tập trung trong từng thao tác, giữ cho mỗi buổi trị liệu an toàn và trọn vẹn.

Thư pháp của thầy Mai Phong
Cơ sở 2 · 03/10/2025

Thư pháp của thầy Mai Phong

Bức thư pháp vàng trên tường phòng chờ mang dấu ấn riêng của thầy.

Phòng chờ nhiều ánh sáng
Cơ sở 2 · 03/10/2025

Phòng chờ nhiều ánh sáng

Kính trong suốt, cây xanh và kệ tinh dầu ánh vàng tạo cảm giác dễ chịu ngay khi bước vào.

Trò chuyện bên chén trà
Cơ sở 2 · 03/10/2025

Trò chuyện bên chén trà

Khách và nhân viên trò chuyện thân tình, chờ đến lượt trong không khí thoải mái.

Một góc thư giãn
Cơ sở 2 · 03/10/2025

Một góc thư giãn

Trà nóng và góc ngồi yên tĩnh giúp khách thả lỏng trước buổi trị liệu.

Nghỉ chân giữa ngày
Cơ sở 2 · 03/10/2025

Nghỉ chân giữa ngày

Tiếng xe ngoài phố xa dần khi khách ngồi sau lớp kính xanh lá.

Kệ vòm ánh vàng
Cơ sở 2 · 03/10/2025

Kệ vòm ánh vàng

Tinh dầu và tiểu cảnh được đặt trong góc vòm ấm áp.

Đón tiếp tận nơi
Cơ sở 2 · 03/10/2025

Đón tiếp tận nơi

Nhân viên ra tận nơi hỏi thăm để khách yên tâm chờ đến lượt.

Cười nói rộn ràng
Cơ sở 2 · 03/10/2025

Cười nói rộn ràng

Cơ sở 2 mỗi ngày đều rộn tiếng cười của khách quen và khách mới.

Sinh nhật thầy Mai Phong
Tình thầy trò

Sinh nhật thầy Mai Phong

Khách và những người thân quen dành cho thầy lời chúc sinh nhật chân thành.

Những lời chúc từ đệ tử
Tình thầy trò

Những lời chúc từ đệ tử

Các đệ tử cùng khách quây quanh thầy, tay vỗ mừng bên chiếc bánh kem.

Quasa kính chào quý khách
Hôm nay

Quasa kính chào quý khách

Toàn thể đội ngũ luôn sẵn sàng đồng hành cùng quý khách trên hành trình chăm sóc sức khỏe.

Hôm nay

Sáu năm, hai cơ sở, một lời hứa

Quasa vẫn giữ nguyên điều ban đầu: tận tâm với từng người đến đây.

Chặng mới

Mr. Mai Phong

Quasa Relax Spa

1 / 30

Giá và thời lượng theo ảnh menu từng cơ sở · Vui lòng liên hệ lễ tân để xác nhận dịch vụ trước khi đặt lịch.

Dịch vụ nổi bật

Massage trị liệu dưỡng sinh đông y

Trị liệu cơ, xương, khớp theo hướng dưỡng sinh đông y.

Phục hồi đau mỏi

Giảm đau mỏi vai, cổ, gáy và đau lưng.

Massage body, da mặt, gội đầu

Massage body, chăm sóc da mặt và gội đầu dưỡng sinh.

Các dịch vụ spa khác sẽ được cập nhật.

Địa Chỉ 2 Cơ Sở:

Quasa cơ sở 1

Cơ sở 1:

07B Nguyễn Trãi, thành phố Quy Nhơn
Điện thoại: 0967 670 788
Giờ mở cửa: 08:30 – 21:00 FB: https://www.facebook.com/profile.php?id=61586210314938

Quasa cơ sở 2

Cơ sở 2:

256 Ngô Mây, thành phố Quy Nhơn
Điện thoại: 0927 855 559
Giờ mở cửa: 08:30 – 22:00 FB: https://www.facebook.com/profile.php?id=61578232036046

☎Gọi CS10967 670 788 ☎Gọi QUASA0927.855.559 ✉Nhắn SMS0927.855.559 ZNhắn Zalo0927.855.559 MessengerQUASA Relax Spa & Wellness

Đăng nhập

Quản trị viên · Nhân sự & phân quyền

Chỉ Admin hệ thống được xóa thành viên, đổi mật khẩu và duyệt thành viên lên Quản trị viên.

Tạo nhiều tài khoản độc lập trong mỗi bộ phận. Mỗi người có ID riêng, cơ sở và điểm riêng.

Quản trị viên · Quản lý cơ sở · 6 thành viên

Quản trị viên · admin
Toàn hệ thống · Admin hệ thống
Gia Hân · giahan
Cơ sở 2 · Quản lý cơ sở
Xuân Nhi · xuannhi
Cơ sở 1 · Quản trị viên
Ánh Cool · anhcool
Cơ sở 1 · Quản lý cơ sở
Giang · vinhgiang
Cơ sở 2 · Quản trị viên
Mai Phong · maiphong
Cơ sở 1 · Quản trị viên

Lễ tân · Cơ sở 1 · 0 thành viên

Lễ tân · Cơ sở 2 · 0 thành viên

Kỹ thuật viên · Cơ sở 1 · 0 thành viên

Kỹ thuật viên · Cơ sở 2 · 2 thành viên

Út Quanh · utquanh
Cơ sở 2 · Kỹ thuật viên
Ái Phượng · aiphuong
Cơ sở 2 · Kỹ thuật viên

Bộ phận khác · 3 thành viên

Thầy Mai Phong · thay
Toàn hệ thống · Thầy
Trợ lý · troly
Toàn hệ thống · Trợ lý
Thư ký · thuky
Toàn hệ thống · Thư ký

Thêm thành viên

QUASA · Quản trị hệ thống

Bán hàng · Lịch & phòng · Khách hàng · Nhân sự · Trợ lý AI

Tổng quan hệ thống

Dữ liệu vận hành được lưu trên máy chủ và kiểm tra quyền theo tài khoản, cơ sở. Dùng Công cụ → Tải dữ liệu mới từ máy chủ khi chuyển giữa các thiết bị.

11Tài khoản
6Quản trị viên
30Slide hành trình
0File dữ liệu
16Hồ sơ nhiệm vụ
0Khách đã lưu
Quyền đang áp dụng
Quản trị viên · Admin hệ thống
Toàn quyền hệ thống.
Thao tác nhanh

Nội dung website

Chỉ Admin hệ thống và Quản trị viên được sửa. Các thành viên thường luôn ở chế độ chỉ xem.

top · h2Nội dung chữ
top · psub
top · pNội dung chữ
top · psign
top · pq-book-caption
hanh-trinh · h2Nội dung chữ
hanh-trinh · plead
Slide 1 · smallNội dung chữ
Slide 1 · h3Nội dung chữ
Slide 1 · pNội dung chữ
Slide 2 · smallNội dung chữ
Slide 2 · h3Nội dung chữ
Slide 2 · pNội dung chữ
Slide 3 · smallNội dung chữ
Slide 3 · h3Nội dung chữ
Slide 3 · pNội dung chữ
Slide 4 · smallNội dung chữ
Slide 4 · h3Nội dung chữ
Slide 4 · pNội dung chữ
Slide 5 · smallNội dung chữ
Slide 5 · h3Nội dung chữ
Slide 5 · pNội dung chữ
Slide 6 · smallNội dung chữ
Slide 6 · h3Nội dung chữ
Slide 6 · pNội dung chữ
Slide 7 · smallNội dung chữ
Slide 7 · h3Nội dung chữ
Slide 7 · pNội dung chữ
Slide 8 · smallNội dung chữ
Slide 8 · h3Nội dung chữ
Slide 8 · pNội dung chữ
Slide 9 · smallNội dung chữ
Slide 9 · h3Nội dung chữ
Slide 9 · pNội dung chữ
Slide 10 · smallNội dung chữ
Slide 10 · h3Nội dung chữ
Slide 10 · pNội dung chữ
Slide 11 · smallNội dung chữ
Slide 11 · h3Nội dung chữ
Slide 11 · pNội dung chữ
Slide 12 · smallNội dung chữ
Slide 12 · h3Nội dung chữ
Slide 12 · pNội dung chữ
Slide 13 · smallNội dung chữ
Slide 13 · h3Nội dung chữ
Slide 13 · pNội dung chữ
Slide 14 · smallNội dung chữ
Slide 14 · h3Nội dung chữ
Slide 14 · pNội dung chữ
Slide 15 · smallNội dung chữ
Slide 15 · h3Nội dung chữ
Slide 15 · pNội dung chữ
Slide 16 · smallNội dung chữ
Slide 16 · h3Nội dung chữ
Slide 16 · pNội dung chữ
Slide 17 · smallNội dung chữ
Slide 17 · h3Nội dung chữ
Slide 17 · pNội dung chữ
Slide 18 · smallNội dung chữ
Slide 18 · h3Nội dung chữ
Slide 18 · pNội dung chữ
Slide 19 · smallNội dung chữ
Slide 19 · h3Nội dung chữ
Slide 19 · pNội dung chữ
Slide 20 · smallNội dung chữ
Slide 20 · h3Nội dung chữ
Slide 20 · pNội dung chữ
Slide 21 · smallNội dung chữ
Slide 21 · h3Nội dung chữ
Slide 21 · pNội dung chữ
Slide 22 · smallNội dung chữ
Slide 22 · h3Nội dung chữ
Slide 22 · pNội dung chữ
Slide 23 · smallNội dung chữ
Slide 23 · h3Nội dung chữ
Slide 23 · pNội dung chữ
Slide 24 · smallNội dung chữ
Slide 24 · h3Nội dung chữ
Slide 24 · pNội dung chữ
Slide 25 · smallNội dung chữ
Slide 25 · h3Nội dung chữ
Slide 25 · pNội dung chữ
Slide 26 · smallNội dung chữ
Slide 26 · h3Nội dung chữ
Slide 26 · pNội dung chữ
Slide 27 · smallNội dung chữ
Slide 27 · h3Nội dung chữ
Slide 27 · pNội dung chữ
Slide 28 · smallNội dung chữ
Slide 28 · h3Nội dung chữ
Slide 28 · pNội dung chữ
Slide 29 · smallNội dung chữ
Slide 29 · h3Nội dung chữ
Slide 29 · pNội dung chữ
Slide 30 · smallNội dung chữ
Slide 30 · h3Nội dung chữ
Slide 30 · pNội dung chữ
dich-vu · h2Nội dung chữ
dich-vu · h3Nội dung chữ
dich-vu · pNội dung chữ
dich-vu · h3Nội dung chữ
dich-vu · pNội dung chữ
dich-vu · h3Nội dung chữ
dich-vu · pNội dung chữ
dich-vu · pNội dung chữ
co-so · h2Nội dung chữ
co-so · h3Nội dung chữ
co-so · h3Nội dung chữ

Dữ liệu Excel theo bộ phận

Thêm file XLS/XLSX/CSV cho từng nhân sự hoặc bộ phận. WebUI chỉ tổng hợp số liệu; không tự động ra quyết định nhân sự.

Chưa có file dữ liệu nào.

Nhiệm vụ ngày · Hồ sơ Excel

Hệ thống tự tạo hồ sơ nhiệm vụ mới mỗi ngày theo vai trò Lễ tân/CSKH, Kỹ thuật viên, Trợ lý, Thư ký và Quản lý; ngày cũ được lưu lịch sử. Thành viên được đánh dấu hoàn thành/ghi chú nhiệm vụ của mình; Admin/Quản trị viên được chỉnh sửa nội dung hồ sơ.

Mẫu nhiệm vụ tự động theo bộ phận

Mỗi tài khoản thuộc các vai trò vận hành dưới đây được tạo 01 hồ sơ mới khi sang ngày mới. Hồ sơ ngày trước vẫn được giữ lại làm lịch sử.

Lễ tân / CSKHLiên hệ · lịch · đón khách · dữ liệu · thanh toán · CSKH · bàn giao
Kỹ thuật viênChuẩn bị · đúng quy trình · theo dõi khách · vệ sinh · báo bất thường
Trợ lýĐiều phối · theo dõi việc · hỗ trợ báo cáo · truyền thông · kế hoạch
Thư kýLịch/data · doanh thu · đối soát · báo cáo · điều phối thông tin · bảo mật
Quản lýNhân sự · ca làm · chất lượng · doanh thu · phản hồi · tài sản · báo cáo cuối ngày
8Hồ sơ hôm nay
1Đã hoàn thành
7Chưa hoàn thành
Chỉ Admin/Quản trị viên được chỉnh sửa hồ sơ nhiệm vụ.

QUASA · Điều hành quản lý

Checklist quản lý hằng ngày · Điểm đánh giá · Tiến độ Lễ tân/KTV cùng cơ sở. Dữ liệu demo cập nhật ngay trong trình duyệt, không đồng bộ giữa điện thoại.

● Cập nhật tại thiết bị · 18:41:21 · Toàn hệ thống
0%Tiến độ đội ngũ · 0/105 việc
100%Điểm trung bình nhân sự
0/0Checklist quản lý hôm nay
10Nhân sự trong phạm vi
Checklist của quản lý hôm nay
Chưa có checklist ngày. Hệ thống sẽ tự tạo checklist Quản lý cơ sở cho ngày mới.
Tiến độ nhân sự trong phạm vi
Thầy Mai PhongThầy · Cơ sở 1
0% nhiệm vụ · 0/0
100%
Trợ lýTrợ lý · Cơ sở 1
0% nhiệm vụ · 0/10
100%
Thư kýThư ký · Cơ sở 1
0% nhiệm vụ · 0/11
100%
Gia HânKhác · Cơ sở 2
0% nhiệm vụ · 0/14
100%
Út QuanhKỹ thuật viên · Cơ sở 2
0% nhiệm vụ · 0/11
100%
Xuân NhiQuản lý · Cơ sở 1
0% nhiệm vụ · 0/12
100%
Ái PhượngKỹ thuật viên · Cơ sở 2
0% nhiệm vụ · 0/11
100%
Ánh CoolKhác · Cơ sở 1
0% nhiệm vụ · 0/14
100%
GiangQuản lý · Cơ sở 2
0% nhiệm vụ · 0/10
100%
Mai PhongQuản lý · Cơ sở 1
0% nhiệm vụ · 0/12
100%
Điểm quản lý

Quản lý không tự chấm điểm cho mình; Thư ký, Quản trị viên và Admin hệ thống được ghi nhận điểm Quản lý cơ sở theo quy định đã duyệt.

100%Điểm cá nhân tháng này · -0 / +0

Tiến độ nhiệm vụ theo thời gian thực

Admin/Quản trị viên xem toàn hệ thống; quản lý chỉ xem KTV và Lễ tân cùng cơ sở. Dữ liệu demo cập nhật trong cùng trình duyệt; bản máy chủ cần API đồng bộ để realtime giữa các điện thoại.

Đang cập nhật · 18:41:21
0%Tiến độ toàn hệ thống
0/105Dòng nhiệm vụ hoàn thành
0/10Thành viên hoàn tất 100%
0%hoàn thành
Thầy Mai Phong
Thầy · Thầy
0/0 nhiệm vụ hoàn thành · 0 hồ sơChưa có nhiệm vụ ngày này
0%hoàn thành
Trợ lý
Trợ lý · Trợ lý
0/10 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Thư ký
Thư ký · Thư ký
0/11 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Gia Hân
Quản lý cơ sở · Khác
0/14 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Út Quanh
Kỹ thuật viên · Kỹ thuật viên
0/11 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Xuân Nhi
Quản trị viên · Quản lý
0/12 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Ái Phượng
Kỹ thuật viên · Kỹ thuật viên
0/11 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Ánh Cool
Quản lý cơ sở · Khác
0/14 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Giang
Quản trị viên · Quản lý
0/10 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện
0%hoàn thành
Mai Phong
Quản trị viên · Quản lý
0/12 nhiệm vụ hoàn thành · 1 hồ sơ○ Đang thực hiện

QUASA · Điểm nhân viên & thống kê bộ phận

Điểm đầu tháng 100. Biểu đồ % tương ứng điểm / 100. Nhiệm vụ chưa hoàn thành chỉ là chỉ số tiến độ, không tự động trừ điểm. Chỉ người có quyền mới được xác minh và ghi nhận lỗi.

Cập nhật · 18:41:21
100%Điểm TB / 100
-0Điểm trừ đã xác minh
26Việc chưa hoàn thành (không tự trừ)
10Nhân sự trong phạm vi
100%100/100
Thầy1 nhân sựXuất sắc · Trung bình tháng
100%100/100
Trợ lý1 nhân sựXuất sắc · Trung bình tháng
100%100/100
Thư ký1 nhân sựXuất sắc · Trung bình tháng
100%100/100
Khác2 nhân sựXuất sắc · Trung bình tháng
100%100/100
Kỹ thuật viên2 nhân sựXuất sắc · Trung bình tháng
100%100/100
Quản lý3 nhân sựXuất sắc · Trung bình tháng
Thống kê cá nhân
Nhân sựBộ phậnĐiểm / %Điểm trừĐiểm cộngViệc cần xem xétXếp loạiThao tác
Thầy Mai Phong
Cơ sở 1
Thầy100%-0+05Xuất sắc
Trợ lý
Cơ sở 1
Trợ lý100%-0+010Xuất sắc
Thư ký
Cơ sở 1
Thư ký100%-0+011Xuất sắc
Gia Hân
Cơ sở 2
Khác100%-0+00Xuất sắc
Út Quanh
Cơ sở 2
Kỹ thuật viên100%-0+00Xuất sắc
Xuân Nhi
Cơ sở 1
Quản lý100%-0+00Xuất sắc
Ái Phượng
Cơ sở 2
Kỹ thuật viên100%-0+00Xuất sắc
Ánh Cool
Cơ sở 1
Khác100%-0+00Xuất sắc
Giang
Cơ sở 2
Quản lý100%-0+00Xuất sắc
Mai Phong
Cơ sở 1
Quản lý100%-0+00Xuất sắc
Ghi nhận sai phạm hoặc thành tích đã xác minh

Đang chấm: Thầy Mai Phong · Thầy · Cơ sở 1. Chọn lỗi và kiểm tra lý do trước khi xác nhận.

Xem nội quy · Điểm cộng (+) · Điểm trừ (−)

Chưa có thay đổi điểm trong tháng.

Đề xuất bổ sung sai phạm

Quản lý được đề xuất quy tắc mới cho KTV, Lễ tân hoặc Quản lý. Quy tắc chỉ có hiệu lực sau khi Admin/Quản trị viên duyệt. Không được tự sửa mức điểm đã công bố hoặc tự chấm điểm.

Chưa có đề xuất.

Xếp loại và ghi nhận
95–100Xuất sắc · Xét thưởng theo quy chế
90–94Tốt
80–89Đạt
70–79Cần cải thiện · Hướng dẫn
60–69Cảnh báo · Kế hoạch khắc phục
Dưới 60Không đạt · Đào tạo/đánh giá lại

Điểm không dùng để tự động phạt tiền, trừ lương hay sa thải.

Chat nội bộ & thông báo

Tin nhắn nội bộ cho từng thành viên hoặc nhóm chung. Nút Chat bên ngoài hiển thị số tin chưa đọc, âm báo và thông báo trình duyệt khi được cấp quyền.

Bản HTML độc lập lưu chat trên trình duyệt. Chat thời gian thực giữa nhiều điện thoại/máy tính cần triển khai website có backend/database; bản này không giả lập đồng bộ internet.
1Tổng tin nhắn lưu trên trình duyệt
0Chưa đọc của tài khoản hiện tại
10Thành viên có thể chat
Tin gần đây
test

Data khách đặt lịch

Khu này dành cho Lễ tân, Admin và Quản trị viên. Có thể mở trực tiếp bằng đường dẫn nội bộ #quasa-khach-hang.

0Tổng data khách
0Lịch hôm nay
0Chờ xác nhận

Phân quyền tài khoản

Admin hệ thống có quyền xét duyệt lên Quản trị viên, hạ quyền hoặc xóa tài khoản. Quản trị viên không được tự nâng quyền người khác.

Vai tròQuyền
Admin hệ thốngToàn quyền hệ thống, dữ liệu và quản lý tài khoản.
Quản trị viênNội dung, điểm, khách hàng, nhiệm vụ và thống kê toàn hệ thống.
Quản lý cơ sởChỉ xem thống kê/nhiệm vụ và chấm điểm KTV, Lễ tân cùng cơ sở. Đề xuất quy tắc mới chờ duyệt.
Lễ tânThêm/sửa và xem hồ sơ khách thuộc cơ sở được phân công; nhiệm vụ và điểm cá nhân.
Kỹ thuật viên / Trợ lý / Thư ký / ThầyChỉ nhiệm vụ, tiến độ và điểm cá nhân; không xem dữ liệu chung.
6Quản trị viên & Quản lý
0Lễ tân
2Kỹ thuật viên
3Bộ phận khác

Có thể tạo nhiều nhân viên cùng chức vụ bằng ID độc lập. Quản lý cơ sở thuộc nhóm quản trị về cơ cấu, nhưng chỉ có quyền quản lý KTV/Lễ tân trong cơ sở phụ trách.

File host & sao lưu

Xuất một file HTML đầy đủ để mở trực tiếp hoặc đưa lên hosting. File xuất có giao diện công khai và toàn bộ WebUI quản trị.

Website
Khi chạy ngoài môi trường hỗ trợ publish trực tiếp, nút “Lưu/Publish” sẽ tự chuyển sang tải file HTML về máy để không mất thay đổi.
Sao lưu cấu hình

Nhật ký quản trị

Ghi lại thao tác chính trên trình duyệt hiện tại.

Cập nhật quyền: maiphong
Tự động tạo 1 hồ sơ nhiệm vụ ngày 2026-10-02
Thêm tài khoản: maiphong
Đăng nhập
Đăng nhập
Xuất HTML Host
Cập nhật quyền: vinhgiang
Thêm tài khoản: vinhgiang
Tự động tạo 1 hồ sơ nhiệm vụ ngày 2026-10-02
Đổi mật khẩu: giahan
Đổi mật khẩu: aiphuong
Đổi mật khẩu: anhcool
Đăng nhập
Tự động tạo 2 hồ sơ nhiệm vụ ngày 2026-10-02
Đăng nhập
Đăng nhập
Tự động tạo 2 hồ sơ nhiệm vụ ngày 2026-10-02
Đăng nhập
Đăng xuất
Đăng nhập
Tự động tạo 5 hồ sơ nhiệm vụ ngày 2026-10-02
Đăng nhập

QUASA · Quản lý khách đặt lịch

Lễ tân · Quản trị viên · Admin hệ thống

Thêm / cập nhật khách
Danh sách theo ngày
0Tổng hồ sơ khách
0Lịch sử dụng hôm nay
0Đã sử dụng dịch vụ
Ngày đặtNgày dùngKháchSĐTGói dịch vụCơ sởTrạng tháiGhi chú

Nhiệm vụ của tôi

Nhiệm vụ cá nhân và checklist ngày. Quản lý cơ sở có checklist tự động mỗi ngày, đồng thời được chỉnh nhiệm vụ của KTV/Lễ tân cùng cơ sở.

Hiện chưa có hồ sơ nhiệm vụ được giao cho tài khoản này.
Nội quy · Điểm cộng/trừ · Điều kiện 100 điểm
QUASA Chat nội bộ
Quản trị viên · Admin hệ thống
Chat hiện lưu trên trình duyệt này; chưa nhận tin xuyên thiết bị.
Thầy Mai Phong · 07:16:42 1/10/2026 · Nhóm chung
hello
Thầy Mai Phong · 07:16:47 1/10/2026 · Nhóm chung
ai cũng thấy
Quản trị viên · 07:34:33 1/10/2026 · Nhóm chung
:(
Quản trị viên · 08:22:30 1/10/2026 · Nhóm chung
😂
';const u=URL.createObjectURL(new Blob(['\ufeff'+html],{type:'application/vnd.ms-excel;charset=utf-8'})),a=document.createElement('a');a.href=u;a.download=filename+'.xls';a.click();setTimeout(()=>URL.revokeObjectURL(u),1500);toast('Đã xuất file Excel .xls ngoại tuyến.')} function exportTasksExcel(){if(!can('tasksEdit'))return;const rows=[['Ngày','ID thành viên','Nhân sự','Bộ phận','Hồ sơ / file nhiệm vụ','STT','Nhiệm vụ','Trạng thái','Ghi chú','Người cập nhật','Thời điểm hoàn thành']];qstate.tasks.forEach(set=>set.items.forEach((it,i)=>rows.push([set.date,set.member,nameOf(set.member),set.dept,set.title,i+1,it.text,it.done?'Hoàn thành':'Chưa hoàn thành',it.note||'',it.doneBy?nameOf(it.doneBy):'',it.doneAt?new Date(it.doneAt).toLocaleString('vi-VN'):''])));exportRowsExcel(rows,'QUASA_Nhiem_vu_'+localDay(),'Nhiem vu');audit('Xuất Excel nhiệm vụ')} $('taskExportExcel').onclick=exportTasksExcel; /* ---------- Task score tracking (100-point monthly scale) ---------- */ const SCORE_BASE=100,DEFAULT_TASK_PENALTY=2; function taskPenalty(it){const n=Number(it&&it.penalty);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):DEFAULT_TASK_PENALTY} function scoreMonthNow(){return localDay().slice(0,7)} function scoreSnapshot(member,month,includeToday=false){ const today=localDay();let missed=0,total=0,done=0; qstate.tasks.filter(s=>s.member===member&&String(s.date||'').slice(0,7)===month).forEach(set=>{ set.items.forEach(it=>{total++;if(it.done){done++;return}if(set.datex.member===member&&x.month===month&&x.status!=='rejected'); const manual=history.reduce((n,x)=>n+(Number(x.delta)||0),0); const deduction=history.filter(x=>Number(x.delta)<0).reduce((n,x)=>n-Math.min(0,Number(x.delta)||0),0); const role=accts.find(a=>a.id===member)?.role;const positives=history.filter(x=>Number(x.delta)>0).reduce((n,x)=>n+Number(x.delta),0);const bonus=role==='ktv'?Math.min(15,positives):positives; const score=Math.max(0,Math.min(100,SCORE_BASE-deduction+bonus)); return{score,deduction,manual,missed,total,done,bonus}; } function scoreBand(v){if(v>=95)return{t:'Xuất sắc',c:'score-excellent'};if(v>=90)return{t:'Tốt',c:'score-good'};if(v>=80)return{t:'Đạt',c:'score-good'};if(v>=70)return{t:'Cần cải thiện',c:'score-watch'};if(v>=60)return{t:'Cảnh báo',c:'score-alert'};return{t:'Không đạt',c:'score-danger'}} /* Bộ quy tắc trừ điểm đã thống nhất cho từng bộ phận; người quản lý không thay đổi điểm gốc trực tiếp. */ /* Nội quy theo poster QUASA · điểm cộng theo hành vi có xác minh, không tự trừ tiền lương. */ const COMMON_RULES=[]; const SPECIAL_RULES={ letan:[ ['Đi trễ hoặc về sớm 1 lần','-1'],['Không dọn dẹp khu vực làm việc sạch sẽ, ngăn nắp đầu ca','-2'],['Chưa đến spa nhưng đã báo có mặt','-2'],['Nghỉ không phép, không lý do','-2'],['Không check tin nhắn khách đầu ca','-2'],['Không kiểm tra lịch hẹn trong ngày','-2'],['Khu vực lễ tân bừa bộn, thiếu ngăn nắp','-2'],['Nghỉ trưa quá 1 tiếng không phép','-2'],['Không đổ rác trước khi về','-1'],['Xin ra ngoài quá 1 tiếng vào việc riêng','-2'],['Không mang bảng tên','-2'],['Không xác nhận thông tin cấp trên đưa xuống','-3'],['Sử dụng điện thoại cá nhân vào việc riêng','-2'],['Mặc không đúng đồng phục, đầu tóc không gọn gàng','-2'], ['Đi trễ/về sớm quá 3 lần trong tháng','-5'],['Bỏ sót tin nhắn khách hoặc phản hồi chậm trong vòng 15 phút','-5'],['Không báo lịch hẹn lên nhóm hoặc không cập nhật lịch lên file','-5'],['Không gọi điện hỏi thăm/chăm sóc khách theo quy định','-5'],['Không kiểm tra khách cũ hoặc không chăm sóc khách sau dịch vụ','-5'],['Thái độ thiếu niềm nở, giao tiếp kém','-6'],['Tự ý rời vị trí khi chưa có người coi quầy','-6'],['Không trực nhật/dọn vệ sinh theo phân công quản lý','-5'],['Không gọi, nhắn tin nhắc lịch khách hẹn','-5'],['Không tắt điện, máy lạnh trước khi về','-3'],['Né tránh, đùn đẩy trách nhiệm khi tiếp khách','-5'],['Tự ý lựa chọn, ưu tiên hoặc điều chuyển khách cho KTV trái quy trình','-6'],['Tự ý thay đổi giá dịch vụ/chương trình khuyến mãi/voucher','-6'],['Kết thúc ca làm khi chưa bàn giao đầy đủ lịch khách','-5'],['Tự ý tiết lộ các cam kết lịch hẹn với khách khi chưa kiểm tra','-5'],['Mặc không đúng đồng phục, đầu tóc không gọn gàng (tái phạm)','-5'],['Không để khách đến không được tiếp đón/không thông báo do người phụ trách','-5'], ['Bỏ tin nhắn/cuộc gọi hoặc lịch hẹn làm ảnh hưởng trải nghiệm khách','-10'],['Bị khách đánh giá 1–2 sao do thái độ, chăm sóc hoặc xử lý kém','-10'],['Nghỉ thứ 7, Chủ nhật không có lý do chính đáng','-10'],['Đi trễ quá 8 tiếng trong 1 tháng','-10'],['Thái độ khó chịu, tranh cãi với khách, làm ảnh hưởng uy tín QUASA','-10'],['Tự ý đổi hoặc hủy lịch của khách gây ảnh hưởng hoạt động','-12'],['Tiết lộ thông tin khách hàng, dữ liệu nội bộ spa','-15'],['Hành vi hoặc phát ngôn làm ảnh hưởng nghiêm trọng đến thương hiệu QUASA','-15'],['Che giấu sự cố, khiếu nại nghiêm trọng hoặc gây thiệt hại lớn','-20'],['Tự ý đánh giá Google giả, gây áp lực khách đánh giá 5 sao, cung cấp thông tin không trung thực','-20'],['Trốn tránh trách nhiệm khiến khách hoặc spa chịu thiệt hại','-10'],['Lạm dụng vị trí để thay đổi thỏa thuận giá/lịch trái thẩm quyền','-10'],['Giấu sai sót, đùn đẩy trách nhiệm hoặc đổ lỗi cho bộ phận khác','-10'],['Tự ý xử lý những tình huống vượt thẩm quyền, gây thiệt hại','-20'],['Nhập báo cáo sai sự thật, ghi nhận giờ công/điểm khách sai số liệu','-10'] ], ktv:[ ['Đi trễ/về sớm 1 lần','-1'],['Không đúng đồng phục','-1'],['Không đeo bảng tên','-1'],['Nghỉ không phép, không lý do','-2'],['Đầu tóc/trang phục chưa gọn gàng','-2'],['Không mỉm cười/chào khách','-2'],['Không rửa tay trước khi chuẩn bị dịch vụ','-2'],['Chưa đến spa nhưng đã báo có mặt','-2'],['Không cắt khăn, giấy, bông tẩy trang đúng nơi','-2'],['Không đổ rác trước khi về','-2'],['Xin ra ngoài quá 1 tiếng vào việc riêng','-2'],['Dụng cụ không để đúng vị trí','-2'], ['Đi trễ/về sớm quá 3 lần trong tháng','-5'],['Không tắt máy lạnh theo phân công','-3'],['Nghỉ đột xuất không đăng ký trước','-3'],['Không xác nhận thông tin cấp trên đưa xuống','-3'],['Dùng điện thoại khi đang trị liệu khách','-5'],['Không tiếp nhận/báo cáo thông tin quan trọng','-3'],['Không chuẩn bị phòng khi khách chờ','-3'],['Không chuẩn bị sản phẩm/dụng cụ','-3'],['Không sắp xếp giường sau khách dùng','-3'],['Không làm sạch dụng cụ, máy móc sau liệu trình','-3'],['Không tắt điện trước khi về','-3'],['Bỏ khách hoặc tự ý không nhận khách được phân công','-5'],['Đẩy tua không lý do, không xin trước','-5'],['Không trực nhật/đón vệ sinh theo phân công','-3'],['Không bàn giao thông tin khách','-3'], ['Tự ý đổi ca','-5'],['Đi trễ quá 8 tiếng trong 1 tháng','-10'],['Nghỉ thứ 7, Chủ nhật không lý do chính đáng','-10'],['Tranh cãi, thiếu tôn trọng khách hàng','-10'],['Tranh cãi/tranh chấp với đồng nghiệp làm sai quy trình chuyên môn','-10'],['Tự ý thay đổi quy trình khi chưa được phép','-5'],['Không báo cáo sự cố nghiêm trọng','-5'],['Bỏ bước trong quy trình phục vụ','-10'],['Khách phản ánh chính đáng về thái độ phục vụ','-10'],['Bị khách đánh giá làm dịch vụ không đạt hiệu quả hoặc không thơm/không sạch sẽ','-10'],['Tự ý thực hiện dịch vụ ngoài phạm vi phân công','-5'], ['Cẩu thả thiếu tôn trọng trong hình ảnh khách hàng','-10'],['Che giấu sự cố gây ảnh hưởng nghiêm trọng','-10'],['Ảnh hưởng nghiêm trọng đến uy tín QUASA','-10'],['Làm hỏng tài sản do vi phạm quy định','-10'],['Tiết lộ thông tin nội bộ/khách hàng','-10'],['Lấy cắp tài sản/sản phẩm, công cụ','-10'],['Gian lận tài chính','-10'],['Tự ý bỏ việc','-10'] ], quanly:[['Không phân ca/bàn giao ca đúng hạn do lỗi chủ quan','-3'],['Không kiểm tra lịch khách, vật tư và tình trạng phòng','-3'],['Không theo dõi tiến độ nhiệm vụ đã được giao','-3'],['Không báo cáo phản ánh/sự cố quan trọng','-5'],['Thiên vị khi phân tua hoặc chấm điểm có căn cứ','-7'],['Tự ý chỉnh sửa hồ sơ, điểm hoặc doanh thu để trục lợi','-10']] }; const BONUS_RULES={ letan:[['Đi làm đúng giờ, có mặt trước 8h30, tác phong gọn gàng',2],['Dọn dẹp khu vực làm việc sạch sẽ, ngăn nắp đầu ca',2],['Like và share bài Fanpage theo hoạt động được giao (tự nguyện)',2],['Check tin nhắn khách, nhận lịch khách đầy đủ',2],['Kiểm tra khách hàng cũ và chủ động chăm sóc khách cũ/mới',2],['Gọi điện/nhắn tin hỏi thăm khách sau dịch vụ đúng kế hoạch',3],['Theo dõi lịch trình khách và hẹn lịch thăm khám/tái chăm sóc',3],['Phối hợp tốt với KTV/quản lý, không để khách chờ lâu',2],['Hỗ trợ KTV khi khách đông, điều phối hợp lý, hỗ trợ kịp thời',3],['Giữ thái độ niềm nở, tư vấn rõ ràng, khách hài lòng',2]], ktv:[['Khách hàng trực tiếp khen, ghi nhận dịch vụ',5],['Xử lý tốt tình huống khó, giải trải nghiệm khách',5],['Có sáng kiến cải thiện dịch vụ/vận hành',5],['Chủ động hỗ trợ đồng nghiệp khi đông khách',3],['Khách quay lại, yêu cầu đích danh',3],['Chuẩn bị phòng, dụng cụ trước khi được nhắc',2],['Phát hiện, báo sớm sự cố thiết bị/tài sản',2],['Chăm sóc khách sau dịch vụ đúng quy trình',2],['Hỗ trợ nội dung, hình ảnh, marketing cho QUASA',2],['Hoàn thành đầy đủ công việc, báo cáo đúng quy định',1],['Giữ khu vực làm việc sạch sẽ, gọn gàng',1],['Like và share bài Fanpage tự nguyện',2]] }; function rulesFor(r){let i=0;return COMMON_RULES.concat(SPECIAL_RULES[r]||[]).map(([text,raw])=>({id:r+'_'+(++i),role:r,text,points:Math.abs(Number(raw))})).concat((qstate.customRules||[]).filter(x=>x.role===r&&x.approved).map(x=>({id:x.id,role:r,text:x.text,points:x.points})));} function scoreAllowed(a){return !!(a&&canScoreMember(a));} function renderRuleSelect(a){ const el=$('scoreRule');if(!el)return; const items=a?rulesFor(a.role):[]; const key=(a?.role||'none')+'|'+items.map(r=>r.id+':'+r.points+':'+r.text).join('|'); if(el.dataset.inventory!==key){ const previous=el.value; el.innerHTML=''+items.map(r=>'').join(''); if(items.some(r=>r.id===previous))el.value=previous; el.dataset.inventory=key; } } function renderScoreHistory(member,month){const box=$('scoreHistory');if(!box)return;const a=(qstate.scoreAdjustments||[]).filter(x=>x.member===member&&x.month===month).slice().sort((x,y)=>String(y.at).localeCompare(String(x.at)));box.innerHTML=a.length?a.map(x=>'
'+(Number(x.delta)>0?'+':'')+esc(x.delta)+' điểm · '+esc(x.reason||'Không ghi lý do')+''+esc(x.at?.slice(0,16).replace('T',' ')||'')+' · bởi '+esc(nameOf(x.by))+(x.evidence?' · Bằng chứng: '+esc(x.evidence):'')+'
').join(''):'

Chưa có thay đổi điểm trong tháng.

'} function renderScoreDashboard(){ const box=$('scoreMemberTable');if(!box)return; if(!can('scores')){box.innerHTML='
Không có quyền xem điểm nhân sự.
';return} const month=($('scoreMonth')&&$('scoreMonth').value)||scoreMonthNow(),members=scoreScopeMembers(); if(!$('scoreMonth').value)$('scoreMonth').value=month; const rows=members.map(a=>({a,official:scoreSnapshot(a.id,month,false),projected:scoreSnapshot(a.id,month,true)})); const avg=rows.length?Math.round(rows.reduce((n,r)=>n+r.official.score,0)/rows.length):0; const totalDed=rows.reduce((n,r)=>n+r.official.deduction,0),missed=rows.reduce((n,r)=>n+r.official.missed,0); if($('scoreSummary'))$('scoreSummary').innerHTML='
'+avg+'%Điểm TB / 100
-'+totalDed+'Điểm trừ đã xác minh
'+missed+'Việc chưa hoàn thành (không tự trừ)
'+rows.length+'Nhân sự trong phạm vi
'; const depts={};rows.forEach(r=>{let d=deptOf(r.a);(depts[d]||(depts[d]=[])).push(r)}); if($('scoreDeptGrid'))$('scoreDeptGrid').innerHTML=Object.entries(depts).map(([d,rs])=>{const a=Math.round(rs.reduce((n,r)=>n+r.official.score,0)/rs.length),b=scoreBand(a);return '
'+a+'%'+a+'/100
'+esc(d)+''+rs.length+' nhân sự'+esc(b.t)+' · Trung bình tháng
'}).join('')||'
Chưa có dữ liệu bộ phận.
'; box.innerHTML='
'+rows.map(r=>{const b=scoreBand(r.official.score);return ''}).join('')+'
Nhân sựBộ phậnĐiểm / %Điểm trừĐiểm cộngViệc cần xem xétXếp loạiThao tác
'+esc(r.a.name)+'
'+esc(branchOf(r.a))+'
'+esc(deptOf(r.a))+''+r.official.score+'%-'+r.official.deduction+'+'+r.official.bonus+''+r.official.missed+''+b.t+'
'; const targets=members.filter(scoreAllowed); const target=$('scoreTarget'); const desired=targets.map(a=>a.id+':'+a.name+':'+a.role).join('|'); if(target.dataset.inventory!==desired){ const selected=target.value||target.dataset.selected; target.innerHTML=targets.map(a=>'').join(''); target.value=targets.some(a=>a.id===selected)?selected:(targets[0]?.id||''); target.dataset.inventory=desired; } if(!targets.some(a=>a.id===target.value))target.value=targets[0]?.id||''; target.dataset.selected=target.value; box.querySelectorAll('[data-score-select]').forEach(b=>{ const id=b.dataset.scoreSelect; b.disabled=!targets.some(a=>a.id===id); b.textContent=b.disabled?'Chỉ xem':'Chi tiết / chấm điểm'; b.onclick=()=>{if(b.disabled)return;target.value=id;renderScoreForm()}; }); if(!document.activeElement?.closest('.q-score-form'))renderScoreForm(); if($('scoreClock'))$('scoreClock').textContent=new Date().toLocaleTimeString('vi-VN'); renderRuleProposals(); } function renderScoreForm(){let id=$('scoreTarget')?.value;const a=accts.find(x=>x.id===id);if(!a){$('scoreRule').innerHTML='';$('scoreRule').disabled=true;$('scoreSubmit').disabled=true;$('scoreBonus').disabled=true;if($('scoreHint'))$('scoreHint').textContent='Hãy chọn nhân sự được phép chấm điểm trong phạm vi tài khoản.';return}$('scoreTarget').dataset.selected=id; const allowed=scoreAllowed(a);$('scoreSubmit').disabled=!allowed;$('scoreBonus').disabled=!allowed;$('scoreReason').disabled=!allowed; renderRuleSelect(a);const bonuses=BONUS_RULES[a.role]||[],bonusEl=$('scoreBonusRule');if(bonusEl){ const current=bonusEl.value;bonusEl.innerHTML=''+bonuses.map(([text,points],i)=>'').join('');bonusEl.disabled=!allowed||!bonuses.length; if([...bonusEl.options].some(o=>o.value===current))bonusEl.value=current; } const rulesBox=$('scorePosterRuleContent');if(rulesBox){const errors=rulesFor(a.role);rulesBox.innerHTML='

Khởi điểm 100; KTV cộng tối đa 15 điểm/tháng. Chỉ ghi nhận vi phạm/thành tích có bằng chứng. Hoàn thành ngày = đủ checklist và đạt 100 điểm.

Điểm cộng
    '+bonuses.map(([t,v])=>'
  1. +'+v+' · '+esc(t)+'
  2. ').join('')+'
Điểm trừ
    '+errors.map(e=>'
  1. −'+e.points+' · '+esc(e.text)+'
  2. ').join('')+'
';} $('scoreRule').disabled=!allowed;if($('scoreHint'))$('scoreHint').textContent=allowed?'Đang chấm: '+a.name+' · '+deptOf(a)+' · '+branchOf(a)+'. Chọn lỗi và kiểm tra lý do trước khi xác nhận.':'Tài khoản hiện tại không được chấm điểm nhân sự này.'; renderScoreHistory(id,$('scoreMonth').value||scoreMonthNow()); } function recordScore(delta,ruleId){ const member=$('scoreTarget').value,a=accts.find(x=>x.id===member),month=$('scoreMonth').value||scoreMonthNow(); if(!scoreAllowed(a))return toast('Không thể chấm điểm người này hoặc chấm điểm chính mình.'); const reason=$('scoreReason').value.trim(),evidence=$('scoreEvidence').value.trim();if(reason.length<8)return toast('Cần ghi lý do tối thiểu 8 ký tự.'); let points=Math.abs(Number(delta)),rid=ruleId||null; if(delta<0){const r=rulesFor(a.role).find(x=>x.id===ruleId);if(!r)return toast('Phải chọn sai phạm trong bảng đã được duyệt.');points=r.points;} if(delta>0){const list=BONUS_RULES[a.role]||[];const choice=$('scoreBonusRule')?.value;const chosen=choice===''?null:list[Number(choice)];if(list.length&&!chosen)return toast('Chọn hành vi cộng điểm trong bảng nội quy.');if(chosen){points=chosen[1];if(!reason.includes(chosen[0]))return toast('Ghi rõ hành vi đã chọn trong phần lý do.');}else{points=Number($('scoreBonusValue').value);if(!Number.isInteger(points)||points<1||points>5)return toast('Cộng 1–5 điểm khi có thành tích xác minh.');}if(a.role==='ktv'&&scoreSnapshot(member,month).bonus>=15)return toast('KTV đã đạt giới hạn +15 điểm/tháng theo bảng nội quy.');} qstate.scoreAdjustments.push({id:qid('score'),member,month,delta:delta<0?-points:points,ruleId:rid,reason, evidence, at:new Date().toISOString(),by:me.id,status:'confirmed'}); audit((delta<0?'Trừ ':'Cộng ')+points+' điểm '+member+' · '+reason);saveState();renderScoreDashboard();$('scoreReason').value='';$('scoreEvidence').value=''; } function renderRuleProposals(){const wrap=$('scoreRuleProposals');if(!wrap)return;const a=(qstate.ruleProposals||[]).filter(x=>isTop()||x.by===me?.id);wrap.innerHTML=a.map(x=>'
'+esc(x.role)+' · -'+x.points+' điểm · '+esc(x.text)+''+esc(x.status||'pending')+' · '+esc(nameOf(x.by))+''+(isTop()&&x.status==='pending'?'':'')+'
').join('')||'

Chưa có đề xuất.

';wrap.querySelectorAll('[data-rule-approve]').forEach(b=>b.onclick=()=>{const r=qstate.ruleProposals.find(x=>x.id===b.dataset.ruleApprove);if(!r||!isTop())return;r.status='approved';qstate.customRules.push({...r,approved:true});audit('Duyệt quy tắc: '+r.text);saveState();renderScoreDashboard()})} function exportScoresExcel(){if(!can('scores'))return;const month=$('scoreMonth').value||scoreMonthNow();const rows=[['Tháng','ID','Nhân sự','Bộ phận','Điểm / 100','Điểm trừ xác minh','Điểm cộng','Việc cần xem xét']];scoreScopeMembers().forEach(a=>{const o=scoreSnapshot(a.id,month,false);rows.push([month,a.id,a.name,deptOf(a),o.score,o.deduction,o.bonus,o.missed])});exportRowsExcel(rows,'QUASA_Diem_'+month,'Diem');audit('Xuất điểm '+month)} $('scoreBonusRule').onchange=()=>{const a=accts.find(a=>a.id===$('scoreTarget').value),choice=$('scoreBonusRule').value,item=choice===''?null:(BONUS_RULES[a?.role]||[])[Number(choice)];if(!item)return;$('scoreBonusValue').value=item[1];$('scoreReason').value=item[0];}; $('scoreTarget').onchange=renderScoreForm;$('scoreRule').onchange=()=>{const id=$('scoreTarget').value,a=accts.find(x=>x.id===id),r=a?rulesFor(a.role).find(x=>x.id===$('scoreRule').value):null;if(r&&!$('scoreReason').value.trim())$('scoreReason').value=r.text;};$('scoreSubmit').onclick=()=>recordScore(-1,$('scoreRule').value);$('scoreBonus').onclick=()=>recordScore(1,null); $('ruleProposeBtn').onclick=()=>{if(!can('rulePropose')&&!isTop())return;const role=$('newRuleRole').value,text=$('newRuleText').value.trim(),p=Number($('newRulePoints').value);if(!['ktv','letan','quanly'].includes(role)||text.length<12||!Number.isInteger(p)||p<1||p>10)return toast('Nội dung ít nhất 12 ký tự; điểm từ 1 đến 10.');qstate.ruleProposals.push({id:qid('rule'),role,text,points:p,by:me.id,status:'pending',at:new Date().toISOString()});saveState();renderRuleProposals();$('newRuleText').value='';toast('Đã gửi đề xuất đến Admin/Quản trị viên để duyệt.')}; $('selfScoreBtn').onclick=()=>{if(!me)return;const o=scoreSnapshot(me.id,scoreMonthNow(),false);alert('Điểm cá nhân tháng này: '+o.score+'/100 ('+o.score+'%)\\nĐiểm trừ đã xác minh: '+o.deduction+'\\nĐiểm cộng: '+o.bonus+'\\nNhiệm vụ cần xem xét: '+o.missed)}; /* ---------- Reception / customer data ---------- */ function canCRM(){return can('customer')} function resetCRM(){['crmEditId','crmName','crmPhone','crmService','crmNote'].forEach(id=>$(id).value='');$('crmBooked').value=localDay();$('crmServiceDate').value=localDay();$('crmBranch').value=isTop()?'Cơ sở 1':branchOf(me);$('crmStatus').value='Chờ xác nhận'} function openCRM(){if(!canCRM()){toast('Tài khoản không có quyền vào data khách.');history.replaceState(null,'',location.pathname+location.search);return}show('mReception',1);if(!$('crmBooked').value)resetCRM();if(!isTop()){$('crmBranch').value=branchOf(me);$('crmBranch').disabled=true;}else $('crmBranch').disabled=false;renderCustomerTable();renderCustomerSummary()} function saveCRM(){if(!canCRM())return;const id=$('crmEditId').value||qid('customer'),name=$('crmName').value.trim(),phone=$('crmPhone').value.trim(),service=$('crmService').value.trim();if(!phone||!service){toast('Cần có số điện thoại và gói/dịch vụ.');return}let r=qstate.customers.find(x=>x.id===id);if(!isTop()&&r&&r.branch!==branchOf(me))return toast('Không được sửa hồ sơ của cơ sở khác.');if(!isTop()&&$('crmBranch').value!==branchOf(me))return toast('Chỉ được thêm khách thuộc cơ sở của bạn.');const data={id,booked:$('crmBooked').value||localDay(),serviceDate:$('crmServiceDate').value||localDay(),name,phone,service,branch:$('crmBranch').value,status:$('crmStatus').value,note:$('crmNote').value.trim(),updatedAt:new Date().toISOString(),updatedBy:me.id};if(r)Object.assign(r,data);else qstate.customers.unshift({...data,createdAt:new Date().toISOString()});saveState();resetCRM();renderCustomerTable();renderCustomerSummary();audit((r?'Cập nhật':'Thêm')+' khách: '+phone)} function customerFiltered(){let a=visibleCustomers(),f=$('crmFrom').value,t=$('crmTo').value,q=$('crmSearch').value.trim().toLowerCase(),st=$('crmFilterStatus').value;if(f)a=a.filter(x=>x.serviceDate>=f);if(t)a=a.filter(x=>x.serviceDate<=t);if(st)a=a.filter(x=>x.status===st);if(q)a=a.filter(x=>[x.name,x.phone,x.service,x.note].some(v=>String(v||'').toLowerCase().includes(q)));return a.sort((a,b)=>(b.serviceDate+b.booked).localeCompare(a.serviceDate+a.booked))} function renderCustomerTable(){const box=$('crmTable');if(!box||!canCRM())return;const a=customerFiltered(),today=localDay(),todayRows=visibleCustomers().filter(x=>x.serviceDate===today),used=visibleCustomers().filter(x=>x.status==='Đã sử dụng').length;if($('crmStats'))$('crmStats').innerHTML='
'+visibleCustomers().length+'Tổng hồ sơ khách
'+todayRows.length+'Lịch sử dụng hôm nay
'+used+'Đã sử dụng dịch vụ
';box.innerHTML='
'+a.map(x=>'').join('')+'
Ngày đặtNgày dùngKháchSĐTGói dịch vụCơ sởTrạng tháiGhi chú
'+esc(x.booked)+''+esc(x.serviceDate)+''+esc(x.name||'—')+''+esc(x.phone)+''+esc(x.service)+''+esc(x.branch)+''+esc(x.status)+''+esc(x.note||'')+'
';box.querySelectorAll('[data-customer]').forEach(tr=>{const r=qstate.customers.find(x=>x.id===tr.dataset.customer);tr.querySelector('[data-edit]').onclick=()=>{$('crmEditId').value=r.id;$('crmBooked').value=r.booked;$('crmServiceDate').value=r.serviceDate;$('crmName').value=r.name||'';$('crmPhone').value=r.phone;$('crmService').value=r.service;$('crmBranch').value=r.branch;$('crmStatus').value=r.status;$('crmNote').value=r.note||'';document.querySelector('#mReception .admin-main').scrollTop=0};tr.querySelector('[data-del]').style.display=isTop()?'':'none';tr.querySelector('[data-del]').onclick=()=>{if(!isTop())return toast('Chỉ Admin/Quản trị viên được xóa hồ sơ khách.');if(confirm('Xóa hồ sơ khách '+r.phone+'?')){qstate.customers=qstate.customers.filter(x=>x!==r);saveState();renderCustomerTable();renderCustomerSummary();audit('Xóa khách: '+r.phone)}}})} function renderCustomerSummary(){const box=$('customerAdminSummary');if(!box)return;const today=localDay(),a=visibleCustomers().filter(x=>x.serviceDate===today);box.innerHTML='
'+qstate.customers.length+'Tổng data khách
'+a.length+'Lịch hôm nay
'+visibleCustomers().filter(x=>x.status==='Chờ xác nhận').length+'Chờ xác nhận
'+(a.length?'
Lịch dùng dịch vụ hôm nay
'+a.slice(0,12).map(x=>'
'+esc((x.name||'Khách')+' · '+x.service+' · '+x.branch)+'
').join('')+'
':'')} function exportCustomers(){if(!isTop())return toast('Chỉ Admin và Quản trị viên được xuất dữ liệu khách.');const rows=[['Ngày đặt','Ngày sử dụng','Tên khách','Số điện thoại','Gói dịch vụ','Cơ sở','Trạng thái','Ghi chú','Cập nhật bởi']].concat(visibleCustomers().map(x=>[x.booked,x.serviceDate,x.name,x.phone,x.service,x.branch,x.status,x.note||'',nameOf(x.updatedBy||'')]));exportRowsExcel(rows,'QUASA_Data_khach_'+localDay(),'Khach dat lich');audit('Xuất Excel data khách')} $('bReception').onclick=e=>{e.preventDefault();history.replaceState(null,'','#quasa-khach-hang');openCRM()};$('crmCopyLink').onclick=async()=>{const u=location.href.split('#')[0]+'#quasa-khach-hang';try{await navigator.clipboard.writeText(u);toast('Đã sao chép đường dẫn quản lý khách.')}catch(_){prompt('Sao chép đường dẫn này:',u)}};$('crmSave').onclick=saveCRM;$('crmReset').onclick=resetCRM;$('crmExport').onclick=exportCustomers;$('exportCustomersExcel').onclick=exportCustomers;$('openReceptionFromAdmin').onclick=e=>{e.preventDefault();history.replaceState(null,'','#quasa-khach-hang');openCRM()};['crmFrom','crmTo','crmSearch','crmFilterStatus'].forEach(id=>$(id).addEventListener(id==='crmSearch'?'input':'change',renderCustomerTable));$('crmToday').onclick=()=>{$('crmFrom').value=$('crmTo').value=localDay();renderCustomerTable()};$('crmClearFilter').onclick=()=>{['crmFrom','crmTo','crmSearch'].forEach(id=>$(id).value='');$('crmFilterStatus').value='';renderCustomerTable()};addEventListener('hashchange',()=>{if(location.hash==='#quasa-khach-hang')openCRM()}); /* ---------- Export / publish ---------- */ function buildExportHTML(){ const c=document.documentElement.cloneNode(true); c.querySelectorAll('[contenteditable]').forEach(e=>e.removeAttribute('contenteditable')); c.querySelectorAll('.ctl').forEach(e=>e.remove()); c.querySelectorAll('#admbar,.adm,#chatBox,#chatFab').forEach(e=>{e.style.display='';e.classList.remove('on')}); c.querySelectorAll('#intro').forEach(e=>e.remove());c.querySelector('body').classList.remove('introing');c.querySelector('body').classList.remove('editing'); const ac=c.querySelector('#accts');if(ac)ac.textContent=JSON.stringify(accts).replace(/v.classList.remove('on')); const lgk=c.querySelector('#lg');if(lgk)lgk.textContent='Đăng nhập'; const toast=c.querySelector('#toast');if(toast){toast.textContent='';toast.classList.remove('on')} return '\n'+c.outerHTML } function downloadHTML(){ if(!can('save'))return; const blob=new Blob([buildExportHTML()],{type:'text/html;charset=utf-8'}),u=URL.createObjectURL(blob),a=document.createElement('a'); a.href=u;a.download='QUASA_Relax_Spa_WebUI_Host.html';a.click();setTimeout(()=>URL.revokeObjectURL(u),2000);msg('Đã tạo file HTML Host.');audit('Xuất HTML Host') } async function saveWebsite(){ if(!can('save'))return;msg('Đang lưu…');let art=null; try{if(window.claude&&window.claude.use)art=await window.claude.use('artifact')}catch(_){} if(!art){downloadHTML();msg('Không có publish trực tiếp — đã tải file HTML Host.');return} try{await art.publish(buildExportHTML());msg('Đã lưu lên website.');audit('Publish website')} catch(e){downloadHTML();msg('Publish không khả dụng — đã tải HTML Host để dự phòng.')} } $('bSave').onclick=saveWebsite;$('bExport').onclick=downloadHTML;$('admExportTop').onclick=downloadHTML;$('hostExport').onclick=downloadHTML;$('quickExport').onclick=downloadHTML;$('hostSave').onclick=saveWebsite; function exportBackup(){ if(!can('save'))return; const payload={version:3,created:new Date().toISOString(),accounts:accts,state:qstate,content:[...document.querySelectorAll(TXT)].map((e,i)=>({i,text:e.textContent||''}))}; const u=URL.createObjectURL(new Blob([JSON.stringify(payload,null,2)],{type:'application/json'})),a=document.createElement('a');a.href=u;a.download='QUASA_admin_backup.json';a.click();setTimeout(()=>URL.revokeObjectURL(u),1000);audit('Xuất JSON cấu hình') } $('backupExport').onclick=exportBackup; $('backupImportBtn').onclick=()=>{if(!isRoot()){toast('Chỉ Admin hệ thống được khôi phục cấu hình.');return}$('backupImport').click()}; $('backupImport').onchange=async()=>{window.QuasaIntegrated.notify('Bản sao tài khoản phải khôi phục bằng sao lưu máy chủ; không nhập hash/mật khẩu từ HTML.');return;if(!isRoot())return;const f=$('backupImport').files[0];if(!f)return;try{const p=JSON.parse(await quasaReadFile(f,'text'));if(!Array.isArray(p.accounts)||!Array.isArray(p.content))throw new Error('Sai cấu trúc');if(!confirm('Khôi phục tài khoản và nội dung chữ từ bản sao lưu?'))return;accts=p.accounts;if(p.state){qstate={messages:Array.isArray(p.state.messages)?p.state.messages:[],tasks:Array.isArray(p.state.tasks)?p.state.tasks:[],customers:Array.isArray(p.state.customers)?p.state.customers:[]};saveState()}const nodes=[...document.querySelectorAll(TXT)];p.content.forEach(x=>{if(nodes[x.i])nodes[x.i].textContent=x.text});apply();renderContentEditor();renderRoleMatrix();msg('Đã khôi phục cấu hình.');audit('Khôi phục JSON cấu hình')}catch(e){toast('File sao lưu không hợp lệ.')}finally{$('backupImport').value=''}}; async function renderStats(){ if($('stMembers'))$('stMembers').textContent=isTop()?accts.length:scopedMembers().length; if($('stManagers'))$('stManagers').textContent=accts.filter(a=>a.role==='admin'||a.role==='manager'||a.role==='quanly').length; if($('stSlides'))$('stSlides').textContent=document.querySelectorAll('.slide').length; if($('permissionSummary')&&me)$('permissionSummary').innerHTML=''+esc(me.name)+' · '+esc(role(me.role).n)+'
'+(isRoot()?'Toàn quyền hệ thống.':isTop()?'Quản trị nội dung, dữ liệu, điểm và nhiệm vụ.':isBranchManager()?'Chỉ quản lý KTV/Lễ tân cùng cơ sở; không chấm điểm Thầy, Trợ lý, Thư ký hay chính mình.':'Chỉ xem dữ liệu cá nhân và phạm vi được giao.'); if($('stFiles'))$('stFiles').textContent=(await dbAll()).length; if($('stTasks'))$('stTasks').textContent=isTop()?qstate.tasks.length:qstate.tasks.filter(canSeeTaskSet).length; if($('stCustomers'))$('stCustomers').textContent=visibleCustomers().length; updateUnread() } function renderActivity(){ const box=$('activityList');if(!box)return;let a=[];try{a=JSON.parse(localStorage.getItem('quasa_admin_log')||'[]')}catch(_){} box.innerHTML=a.length?a.map(x=>'
'+esc(x.action)+'
').join(''):'
Chưa có nhật ký.
' } $('clearLog').onclick=()=>{if(confirm('Xóa nhật ký trên trình duyệt này?')){localStorage.removeItem('quasa_admin_log');renderActivity()}}; ensureDailyTasks(localDay()); setInterval(dailyRolloverCheck,60000); if($('realtimeDate')){$('realtimeDate').value=localDay();$('realtimeDate').onchange=renderRealtimeTaskDashboard} if($('realtimeToday'))$('realtimeToday').onclick=()=>{$('realtimeDate').value=localDay();renderRealtimeTaskDashboard()}; setInterval(()=>{if(me&&can('scores')&&document.visibilityState==='visible'&&$('mAdmin').style.display==='flex'){renderRealtimeTaskDashboard();renderScoreDashboard();if($('mAdmin').querySelector('[data-pane=operations].on'))renderManagerOperations()}},3000); if($('scoreMonth'))$('scoreMonth').value=scoreMonthNow();if($('scoreThisMonth'))$('scoreThisMonth').onclick=()=>{$('scoreMonth').value=scoreMonthNow();renderScoreDashboard()};if($('scoreMonth'))$('scoreMonth').onchange=renderScoreDashboard;if($('scoreExport'))$('scoreExport').onclick=exportScoresExcel; if($('taskDate'))$('taskDate').value=localDay(); if($('crmBooked'))resetCRM(); taskMemberOptions();renderTasks();renderCustomerSummary();renderChatSummary();updateUnread();setupEmojiPicker(); if(location.hash==='#quasa-khach-hang')setTimeout(()=>{if(me)openCRM();else{show('mLogin',1);$('lid').focus()}},100); function initLuxuryReveal(){ const els=[...document.querySelectorAll('#hanh-trinh,#socialPulse,#dich-vu,#co-so,footer')]; els.forEach(e=>e.classList.add('lux-reveal')); if(!('IntersectionObserver'in window)||matchMedia('(prefers-reduced-motion: reduce)').matches){els.forEach(e=>e.classList.add('is-visible'));return} const io=new IntersectionObserver(entries=>entries.forEach(en=>en.target.classList.toggle('is-visible',en.isIntersecting)),{threshold:.12,rootMargin:'-4% 0px -8% 0px'}); els.forEach(e=>io.observe(e)); } initLuxuryReveal(); window.quasaOpsBridge={importCustomer:id=>{if(!me||!(isTop()||isBranchManager()||me.role==='letan'))throw Error('Không có quyền sửa khách.');const c=window.QuasaImportedCustomers?.list().find(c=>c.id===id);if(!c||(!isTop()&&c.branch!==branchOf(me)))throw Error('Khách không thuộc cơ sở.');if(!qstate.customers.some(x=>x.id===id)){qstate.customers.push({...c,imported:false,importedSource:'DATAT9',updatedAt:new Date().toISOString()});saveState();}return c;},reloadState:()=>{if(!me)throw Error('Cần đăng nhập.');qstate=loadState();renderStats();renderTasks();renderMyTasks();renderCustomerTable();},open:tab=>openAdmin(tab),context:()=>me?{id:me.id,name:me.name,role:me.role,branch:branchOf(me),top:isTop(),manage:isTop()||isBranchManager(),operate:isTop()||isBranchManager()||me.role==='letan'}:null,members:()=>me?accts.filter(a=>isTop()||branchOf(a)===branchOf(me)).map(a=>({id:a.id,name:a.name,role:a.role,branch:branchOf(a)})):[],customers:()=>me&&(isTop()||isBranchManager()||me.role==='letan')?qstate.customers.filter(c=>isTop()||c.branch===branchOf(me)):[],saveCustomer:p=>{if(!me||!(isTop()||isBranchManager()||me.role==='letan'))throw Error('Không có quyền quản lý khách hàng.');if(!isTop()&&p.branch!==branchOf(me))throw Error('Sai phạm vi cơ sở.');const found=p.id?qstate.customers.find(c=>c.id===p.id):null;if(p.id&&!found)throw Error('Khách không tồn tại.');if(found&&!isTop()&&found.branch!==branchOf(me))throw Error('Không có quyền sửa khách này.');if(!String(p.name||'').trim()||!String(p.phone||'').trim())throw Error('Cần tên và số điện thoại.');const duplicate=qstate.customers.find(c=>c.id!==p.id&&c.branch===p.branch&&c.phone===p.phone);if(duplicate&&(!found||found.phone!==p.phone))throw Error('Số điện thoại đã có trong cơ sở.');const data={...p,id:found?found.id:qid('customer'),updatedAt:new Date().toISOString(),updatedBy:me.id};if(found)Object.assign(found,data);else qstate.customers.unshift({...data,createdAt:new Date().toISOString(),booked:localDay(),serviceDate:localDay(),service:p.service||'Chưa chọn dịch vụ',status:'Chờ xác nhận'});saveState();renderCustomerTable();audit('Vận hành lưu khách: '+p.name);return data;}}; window.quasaTaskBridge={user:()=>me?{id:me.id,name:me.name}:null, list:()=>me?qstate.tasks.filter(canSeeTaskSet):[], create:(p)=>{if(!me||!can('tasksEdit'))throw Error('Hãy đăng nhập tài khoản có quyền giao nhiệm vụ.');const a=accts.find(a=>a.id===(p.member||me.id));if(!a||(!canManageMember(a)&&!isTop()))throw Error('Không được giao việc cho thành viên này.');if(!Array.isArray(p.tasks)||!p.tasks.length||p.tasks.length>100||p.tasks.some(t=>typeof t!=='string'||!t.trim()))throw Error('Cần 1–100 nhiệm vụ có nội dung.');const set={id:qid('taskset'),member:a.id,date:p.date||localDay(),title:p.title||'Nhiệm vụ từ trợ lý',dept:deptOf(a),createdAt:new Date().toISOString(),createdBy:me.id,items:p.tasks.map(text=>({id:qid('task'),text:text.trim(),done:false,note:'',penalty:0}))};qstate.tasks.unshift(set);saveState();renderTasks();renderMyTasks();audit('Trợ lý tạo nhiệm vụ: '+set.title);return set;}, update:(p)=>{if(!me)throw Error('Cần đăng nhập.');const set=qstate.tasks.find(s=>s.items.some(i=>i.id===p.id));if(!set||!canSeeTaskSet(set)||(set.member!==me.id&&!can('tasksEdit')))throw Error('Không có quyền cập nhật nhiệm vụ.');const it=set.items.find(i=>i.id===p.id);if(p.text!==undefined){if(!can('tasksEdit'))throw Error('Không có quyền sửa nội dung.');if(typeof p.text!=='string'||!p.text.trim())throw Error('Nội dung không được trống.');it.text=p.text.trim();}if(p.done!==undefined){if(typeof p.done!=='boolean')throw Error('done phải là true hoặc false.');it.done=p.done;it.doneAt=p.done?new Date().toISOString():null;it.doneBy=p.done?me.id:null;}if(p.note!==undefined)it.note=String(p.note);saveState();renderTasks();renderMyTasks();audit('Trợ lý cập nhật nhiệm vụ: '+it.text);return it;}} window.QuasaLegacyRefreshSite=()=>{ui();apply();}; window.QuasaLegacySetUser=u=>{me=u?{...u,branch:u.branches?.[0]||u.branch||'Cơ sở 1'}:null;accts=window.QuasaIntegrated.members();qstate=loadState();if(!me){show('mAdmin',0);show('mReception',0);show('mMyTasks',0);window.QuasaSpa?.reset();window.QuasaInquiries?.clear();}apply();renderStats();renderTasks();renderMyTasks();renderCustomerTable();}; for(const id of ['bMem','openMembers'])if($(id))$(id).onclick=()=>window.QuasaIntegrated.openPanel('users'); document.addEventListener('click',e=>{const b=e.target.closest('[data-tab="members"],[data-jump="members"]');if(b){e.preventDefault();e.stopImmediatePropagation();window.QuasaIntegrated.openPanel('users');}},true); apply(); })();

Dịch vụ & sản phẩm QUASA

Chọn dịch vụ phù hợp và gửi yêu cầu tư vấn. QUASA sẽ xác nhận lịch và dịch vụ trước khi phục vụ.

Liên hệ QUASA để được tư vấn chi tiết. Yêu cầu tư vấn chưa phải giao dịch thanh toán hay xác nhận lịch.

Rio · Thành viên & vận hành

Thống kê QUASA

Khách hàng Cơ sở 1 · Lượt sử dụng

Nguồn DATAT9: bảng tổng hợp theo tháng, chưa có năm, ngày và giờ từng lần sử dụng. “Khách mới” đã đổi thành 1 lượt theo xác nhận. Xếp hạng theo lượt đã biết; số liệu thiếu chưa được cộng.

Yêu cầu tư vấn & đặt lịch

Yêu cầu khách gửi chưa phải lịch đã xác nhận. Lễ tân kiểm tra rồi tạo lịch trong Lịch & Phòng.

QUASA · Quản lý SPA