Báo cáo chi tiết về sự thay đổi kiến trúc, nỗ lực lập trình (effort) và các rủi ro khi chuyển đổi từ nền tảng POS Kiosk sang Mobile App khách hàng.
| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Redesign toàn bộ layout Home | screens/home_screen/ | |
| Banner carousel (tái sử dụng ~30%) | cubits_v2/banner/, cubits_v2/header_banner/ | |
| Welcome bar + Login trigger | Tạo mới widget | |
| Pickup/Delivery toggle | Tạo mới widget + provider | |
| Coupon/Promotion cards | Tạo mới model + cubit + widget | |
| Grid menu (4 ô vuông) | Tạo mới widget | |
| Popup promo (Grand Opening) | Dialog widget mới | |
| Bottom Tab Navigation | Refactor main.dart routing |
screens/select_store/ — có màn chọn store dạng kiosk, không có search, không có tabs.| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Redesign store list UI | screens/select_store/ | |
| Search bar | Tạo widget mới | |
| Tabs Gần bạn / Yêu thích | Tạo mới | |
| Store card (ảnh, khoảng cách, capacity) | models_v2/store.dart cần mở rộng | |
| Location/GPS integration | Package mới + permission | |
| Favorite store logic | Hive local storage |
screens/menu_screen/ — đã có sidebar menu + product list, thiết kế cho tablet kiosk.| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Category sidebar (đã có ~60% logic) | widgets/_menu_wheel.dart, cubits_v2/menuSideBar/ | |
| Product list redesign | widgets/_product_menu_item.dart, cubits_v2/productList/ | |
| Store header info | Widget mới | |
| Deal/Promo banner section | Widget mới | |
| Nút + thêm nhanh vào giỏ | cubits_v2/cart/ | |
| Scroll sync sidebar ↔ list | Logic mới |
screens/select_product_opts_v2/ — đã có image slider, option selectors, quantity picker.| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Image hero section (đã có slider) | widget/_image_slider.dart | |
| Option selectors (đã có logic) | widget/_select_product_opts.dart | |
| Chip-style buttons (Size, Đá, Ngọt) | Widget styling | |
| Dual CTA buttons (Thêm giỏ + Đặt) | Layout mới | |
| Quantity picker (đã có) | widgets/_number_picker.dart | |
| Mô tả expandable | Widget mới |
| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Order history screen | Tạo screen mới | |
| Tab filtering | Widget + logic mới | |
| Order list item widget | Widget mới | |
| Order detail screen | Screen mới | |
| Empty state | Widget mới | |
| Re-order logic | Cubit mới | |
| API integration | Mở rộng service |
| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Profile screen | Screen mới | |
| Membership card widget | Widget + model mới | |
| Points/Voucher display | Widget + cubit mới | |
| Settings icon navigation | Link lại | |
| Notification bell | Widget + logic mới | |
| FAQ webview | Screen mới |
| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Auth flow (login/register/OTP) | 3–4 screens mới | |
| Phone input widget | Widget mới | |
| Social login (Apple, Email) | Packages + logic mới | |
| Token management | Service + interceptor mới | |
| User session/profile model | Model + cubit mới |
screens/payment_screen_v2/ với QR code display + timer. Chủ yếu redesign UI cho mobile style, logic giữ nguyên.| Hạng mục | Effort | Ghi chú |
|---|---|---|
| Redesign UI cho mobile style | Giữ nguyên logic hiện tại | |
| Logic QR / Timer | screens/payment_screen_v2/ |
| Hạng mục | Effort | Files liên quan |
|---|---|---|
| Table selection screen (visual map) | — | |
| Active order at table detection | — | |
| "Gọi thêm" — Add to existing order | — | |
| Order merge logic (append items) | — | |
| Table status (Trống/Đang phục vụ) | — |
| Hạng mục | Effort | Ghi chú |
|---|---|---|
| Cart review redesign cho mobile | — | |
| Checkout flow redesign | — |
| # | Màn hình | % Code mới | Ngày ước tính | Files |
|---|---|---|---|---|
| 01 | Trang chủ | 5–7 ngày | ~12 | |
| 02 | Chọn cửa hàng | 3–4 ngày | ~8 | |
| 03 | Thực đơn (Menu) | 4–5 ngày | ~10 | |
| 04 | Chi tiết sản phẩm | 2–3 ngày | ~6 | |
| 05 | Lịch sử đặt hàng | 4–5 ngày | ~10 | |
| 06 | Tài khoản (Tôi) | 3–4 ngày | ~8 | |
| 07 | Đăng nhập / Đăng ký | 5–7 ngày | ~12 | |
| 8a | Thanh toán QR | 1–2 ngày | ~4 | |
| 8b | Đặt tại bàn + Gọi thêm | 5–6 ngày | ~12 | |
| 8c | Giỏ hàng / Checkout | 2–3 ngày | ~6 | |
| — | Bottom Tab Nav + Theme + Routing | 3–4 ngày | ~8 |
medusa-config.js. Chỉ có JWT_SECRET và COOKIE_SECRET trong config.| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| A1 | Đăng ký SĐT + OTP | 3–4 ngày | Không có code OTP, SMS, phone auth | |
| A2 | Đăng nhập SĐT + OTP | 2–3 ngày | Chung hạ tầng A1 | |
| A3 | Apple Sign-In | 2–3 ngày | Không có OAuth provider | |
| A4 | Đăng nhập Email | 1–2 ngày | Medusa có built-in nhưng chưa enable | |
| A5 | Token management (JWT) | 1–2 ngày | Chỉ có JWT_SECRET, chưa có refresh logic | |
| A6 | Logout | 0.5 ngày | Không có endpoint hay session revocation | |
| A7 | Mã giới thiệu (Referral) | 2–3 ngày | Không có referral table, code, hay logic |
/store/customers/me. Medusa có Customer Module built-in nhưng chưa có custom route nào. Không có membership model, tier logic, points model hay "Tea Leaves" reference.| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| B1 | Lấy thông tin profile | 1 ngày | Enable built-in Customer Module | |
| B2 | Cập nhật profile | 0.5 ngày | Enable built-in | |
| B3 | Membership / Hạng thành viên | 3–4 ngày | Custom module hoàn toàn mới | |
| B4 | Điểm tích lũy (Tea Leaves) | 3–4 ngày | Custom module mới | |
| B5 | Lịch sử điểm | 1–2 ngày | Phụ thuộc B4 | |
| B6 | Quyền lợi thành viên | 1–2 ngày | Không có benefits configuration |
HaravanProductCombo model tồn tại. IPOS client có check_voucher().computeActions(). Chỉ cần enable trong medusa-config.js.| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| C1 | Danh sách voucher của tôi | 2–3 ngày | Không có voucher module, table, hay route | |
| C2 | Voucher người mới | 1–2 ngày | Không có auto-grant logic | |
| C3 | Thu thập voucher | 1 ngày | Không có collect logic | |
| C4 | Áp voucher vào đơn | 2–3 ngày | IPOS check_voucher() có nhưng chưa tích hợp cart | |
| C5 | Promotion banner | 1–2 ngày | Banner model + CRUD có sẵn, cần mở rộng | |
| C6 | Deal/Combo products | 2–3 ngày | Combo model có, chưa có API route/cart integration |
GET /v2/settings/admin/pos/pos_menu + filter product_collection_id đã implement. IposItem model (17 fields) + customizations + options.| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| E1 | Collections/categories | 0 | PosMenuConfig + collection support | |
| E2 | Products theo collection | 0 | Filter product_collection_id hoạt động | |
| E3 | Product detail + variants | 0 | IposItem (17 fields) + variant mapping | |
| E4 | Available per store | 1 ngày | Items linked via store_id, chưa có API riêng |
STORE = "1", DELI = "2").| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| F1 | Tạo cart | 0 | Medusa native Cart module | |
| F2 | Thêm/sửa/xóa line item | 0 | Medusa native API | |
| F3 | Complete cart → Order | 0 | Medusa native flow | |
| F4 | Gắn cart với customer | 1–2 ngày | Customer link chưa implement | |
| F5 | Delivery type | 1 ngày | Cần chuẩn hóa PICKUP/DELIVERY/DINE_IN | |
| F6 | Áp voucher/discount | 2–3 ngày | check_voucher() có nhưng chưa tích hợp cart | |
| F7 | Ghi chú đơn hàng | 0.5 ngày | Field note trong workflow, cần expose rõ hơn |
createQRCode()), config model, payment service hoàn chỉnh. Callback webhook hoạt động: POST /v2/payment/vnpay_callback. Transaction check: POST /v2/cart/check_vn_pay_transaction.| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| G1 | Payment collection + session | 0 | Full implementation trong payment-vnpay/ | |
| G2 | QR Payment (VNPay) | 0 | QR generation, config, service hoàn chỉnh | |
| G3 | Manual Payment | 0 | pp_system_default, PAYMENT_ON_DELIVERY | |
| G4 | Thanh toán bằng điểm | 2–3 ngày | Phụ thuộc Loyalty module (B4) | |
| G5 | Payment status polling (mobile) | 1–2 ngày | VNPay callback có, cần thêm polling endpoint |
GET /v2/orders/pos). Đơn processing có route. IPOS callback cập nhật trạng thái qua workflow (CONFIRMED → IN PROCESS → COMPLETED)./store/customers/me/orders (lịch sử đơn theo customer), Store API route riêng cho chi tiết đơn, Re-order, WebSocket/SSE cho mobile, Filter API.| ID | Tính năng | Hiện có | Effort | Chi tiết |
|---|---|---|---|---|
| H1 | Orders theo table/device | 0 | GET /v2/orders/pos hoạt động tốt | |
| H2 | Đơn đang processing | 0 | GET /v2/orders/pos/processing | |
| H3 | Lịch sử đơn theo customer | 2–3 ngày | Chỉ query theo table/device, không theo customer_id | |
| H4 | Chi tiết đơn hàng | 1–2 ngày | Logic có trong workflow, chưa có store API route | |
| H5 | Re-order | 1–2 ngày | Không có implementation | |
| H6 | Order tracking realtime | 2–3 ngày | IPOS callback có, thiếu WebSocket/SSE | |
| H7 | Filter đơn theo loại | 0.5 ngày | Delivery type trong metadata, chưa có filter API |
| ID | Tính năng | Loại | Effort |
|---|---|---|---|
| — | Version Upgrade (Medusa v2) | Upgrade | 7–9 ngày |
| A1 | Đăng ký SĐT + OTP | MỚI | 3–4 ngày |
| A2 | Đăng nhập SĐT + OTP | MỚI | 2–3 ngày |
| A5 | Token management (JWT) | MỚI | 1–2 ngày |
| A6 | Logout | MỚI | 0.5 ngày |
| B1 | Lấy profile customer | MỚI | 1 ngày |
| D1 | Store + toạ độ/ảnh/giờ | SỬA | 2–3 ngày |
| D2 | Tìm store gần nhất (GPS) | SỬA | 2–3 ngày |
| F4 | Gắn cart với customer | SỬA | 1–2 ngày |
| F5 | Chuẩn hóa delivery type | SỬA | 1 ngày |
| G5 | Payment status polling mobile | SỬA | 1–2 ngày |
| H3 | Lịch sử đơn hàng customer | MỚI | 2–3 ngày |
| H4 | Chi tiết đơn hàng | MỚI | 1–2 ngày |
| I1 | Danh sách bàn + trạng thái | MỚI | 2–3 ngày |
| I2 | Trạng thái bàn realtime | MỚI | 2–3 ngày |
| I3 | Gọi thêm món vào đơn bàn | MỚI | 2–3 ngày |
| I4 | Xem đơn hiện tại của bàn | SỬA | 0.5 ngày |
| ID | Tính năng | Loại | Effort |
|---|---|---|---|
| A3 | Apple Sign-In | MỚI | 2–3 ngày |
| A4 | Email login | MỚI | 1–2 ngày |
| B3 | Membership / Hạng thành viên | MỚI | 3–4 ngày |
| B4 | Điểm tích lũy (Tea Leaves) | MỚI | 3–4 ngày |
| C1 | Voucher của tôi | MỚI | 2–3 ngày |
| C2 | Voucher người mới | MỚI | 1–2 ngày |
| C4 | Áp voucher vào cart | MỚI | 2–3 ngày |
| C5 | Promotion banner management | SỬA | 1–2 ngày |
| C6 | Deal/Combo products | MỚI | 2–3 ngày |
| D3 | Search store theo tên | SỬA | 1 ngày |
| D5 | Số ly đang chuẩn bị | MỚI | 1–2 ngày |
| F6 | Áp voucher/discount | MỚI | 2–3 ngày |
| H6 | Order tracking realtime | MỚI | 2–3 ngày |
| H7 | Filter đơn theo loại | SỬA | 0.5 ngày |
| I5 | Đóng bàn / Thanh toán | MỚI | 1–2 ngày |
| I6 | QR scan bàn | MỚI (FE) | 0.5 ngày |
| J1 | Push notification (FCM) | MỚI | 3–4 ngày |
| K4 | App config / Feature flags | MỚI | 1–2 ngày |
| ID | Tính năng | Loại | Effort |
|---|---|---|---|
| A7 | Mã giới thiệu | MỚI | 2–3 ngày |
| B2 | Cập nhật profile | MỚI | 0.5 ngày |
| B5 | Lịch sử điểm | MỚI | 1–2 ngày |
| B6 | Quyền lợi thành viên | MỚI | 1–2 ngày |
| C3 | Thu thập tất cả voucher | MỚI | 1 ngày |
| D4 | Cửa hàng yêu thích | MỚI | 1–2 ngày |
| D6 | Thời gian chờ ước tính | MỚI | 1–2 ngày |
| E5 | Mô tả sản phẩm rich text | SỬA | 0.5 ngày |
| F7 | Ghi chú đơn hàng | SỬA | 0.5 ngày |
| G4 | Thanh toán bằng điểm | MỚI | 2–3 ngày |
| H5 | Re-order | MỚI | 1–2 ngày |
| J2 | Danh sách thông báo | MỚI | 1–2 ngày |
| J3 | Đánh dấu đã đọc | MỚI | 1 ngày |
src/modules/pos/models/banner.tsMở rộngsrc/api/settings/pos/admin/banner/route.tsGiữsrc/api/settings/pos/app/banner/route.tsGiữsrc/modules/libs/ipos_client.tsTái sử dụngsrc/modules/haravan/models/product.tsTái sử dụngsrc/modules/haravan/models/product_combo.tsMở rộngsrc/modules/providers/payment-vnpay/Giữ/v2/orders/posGiữ