Docs

Thông tin chung

Dự án24H Station → Chagee · mobile_food_delivery
PhasePhase 1
URL kiểm thửhttp://localhost:5050 · API https://24h-api.batnuocdodi.xyz

Nguyên nhân gốc — 78 dòng đỏ dồn về 17 gốc

Bấm vào một gốc để lọc ra đúng những dòng test liên đới. Cột Mở khoá là số dòng sẽ xanh lại sau khi sửa gốc đó.

Sửa nhanh — mở khoá nhiều
R1 R2 R3
tổng 50 phút → mở khoá 21 dòng, không phụ thuộc gì
Phải đụng code
8
gốc — R1 R4 R5 R8 R9 R10 R11 R14 R15
Chỉ nhập dữ liệu
3
gốc — R2 R3 R6 R7 · không cần lập trình viên
Không phải bug
28
dòng — R12 chờ quyết định · R13 cần thiết bị
GốcVấn đềSửa ở đâu Ai sửaCông sứcMở khoáBị chặn bởi
R1 🔴 ?platform=mobile gắn vào mọi lời gọi — route lõi Medusa từ chối tham số lạ medusa_mobile_api.dart:58
xoá hằng _platformQuery
Dev mobile 5 phút 11 dòng
Tái hiện
curl -X POST "$API/store/carts?platform=mobile" -d '{"region_id":"…"}'
# hiện: 400 Unrecognized fields: 'platform'
# bỏ ?platform ra → 200
Nghiệm thu sau khi sửa
Chạy lại TC-CART13: bấm Thêm vào giỏ trong app → giỏ hiện 1 món, không còn nút "Create Basket"
R2 🔴 Ô cấu hình dịch vụ gửi tin bỏ trống → máy chủ gọi vào 127.0.0.1:9101 Admin → Settings → Integration Settings → Mock Notify display endpoint → bật active Người vận hành 15 phút 7 dòng
Tái hiện
curl -X POST "$API/store/auth/otp/send" -d '{"phone":"0912345678"}'
# hiện: 502 otp_display_failed · "fetch failed"
Nghiệm thu sau khi sửa
Chạy lại TC-AUTH01: ra 202 kèm challenge_id, mã hiện ở mock-notify
R3 🔴 Khu vực VN không có phương thức giao hàng nào Admin → Settings → Shipping → tạo option cho region VN Người vận hành 30 phút 3 dòng
Tái hiện
curl "$API/store/shipping-options?cart_id=<cart>"
# hiện: {"shipping_options": []}
Nghiệm thu sau khi sửa
Chạy lại TC-CART09: POST /carts/{id}/complete tạo được đơn
R4 🔴 runAction nuốt mọi lỗi + _debugError tắt ở bản release :6344-6367 hiện ApiException.message
:4972 bỏ chặn kDebugMode
Dev mobile nửa ngày 1 dòng
Tái hiện
Bấm Đăng ký bằng email đã tồn tại trong app
# hiện: "We couldn't complete that action."
# máy chủ thật ra đã trả: "Identity with email already exists"
Nghiệm thu sau khi sửa
Chạy lại TC-AUTH05: app hiện đúng lý do từ máy chủ, không phải câu chung chung
R5 🔴 VNPay đọc nhầm trường tổng tiền route store/carts/[id]/payment/vnpay — đọc cart.total hoặc payment_collection.amount Dev backend nửa ngày 1 dòng R1 · R3
Tái hiện
curl -X POST "$API/store/carts/<cart>/payment/vnpay"
# hiện: 422 "Cart/order total must be a positive number"
# dù cart.total = 60000 và payment_collection.amount = 60000
Nghiệm thu sau khi sửa
Chạy lại TC-CART08: trả về link thanh toán VNPay
R6 🟠 ipos-fabi/modifiers trả rỗng → món không có Size / Mức đá / Độ ngọt Dữ liệu tích hợp iPOS, hoặc gắn option thủ công trong Admin Người vận hành 1 ngày 3 dòng
Tái hiện
curl "$API/store/ipos-fabi/products/<prod>/modifiers"
# hiện: {"ipos_fabi":{"modifiers":[]}}
Nghiệm thu sau khi sửa
Chạy lại TC-WF08: màn chi tiết món hiện đủ 3 nhóm tuỳ chọn
R7 🟠 Thiếu dữ liệu vận hành — 0 cửa hàng · 4/100 sản phẩm chưa gắn giá · route mẫu còn sót Admin: tạo cửa hàng · gắn giá · gỡ /store/custom Người vận hành 1 giờ 3 dòng
Tái hiện
curl "$API/store/stores"        # {"count": 0}
curl "$API/store/custom"        # OK  (route mẫu Medusa)
Nghiệm thu sau khi sửa
TC-DAT04 trả count > 0 · TC-DAT12 trả 404
R8 🟠 Thêm món chưa gắn giá vào giỏ làm máy chủ trả 500 thay vì báo lỗi rõ route store/carts/[id]/line-items — bắt lỗi thiếu giá, trả 400 kèm thông báo Dev backend 2 giờ 1 dòng
Tái hiện
curl -X POST "$API/store/carts/<cart>/line-items" \
  -d '{"variant_id":"variant_01KWY3DTV6RDSZ885N7Q44E27H"}'
# hiện: 500 unknown_error
Nghiệm thu sau khi sửa
Chạy lại TC-CART03: trả 400 kèm câu "sản phẩm chưa có giá ở khu vực này"
R9 🔴 Google chưa nối deep-link cho máy thật · chưa có Sign in with Apple google_auth_launcher.dart thêm app_links + URL scheme
Backend thêm route Apple
Dev mobile 2–3 ngày 3 dòng
Tái hiện
grep -n 'not wired' lib/src/core/google_auth_launcher.dart
# chú thích trong mã tự ghi nhận
grep -ri apple lib/ src/api/   # 0 kết quả
Nghiệm thu sau khi sửa
Đăng nhập Google trên máy thật quay lại được app · có nút Apple hoạt động
R10 🔴 Thiếu màn trong app: đặt lại mật khẩu · mở link thanh toán Viết 2 màn mới, nối resetPasswordcreateVnpayPayment Dev mobile 1–2 ngày 2 dòng R2
Tái hiện
grep -rn 'resetPassword' lib/src/app/   # 0 kết quả
grep -rn 'launchUrl' lib/            # chỉ google_auth_launcher.dart:34
Nghiệm thu sau khi sửa
TC-AUTH13 có màn nhập mã + mật khẩu mới · TC-CART12 mở được trang VNPay
R11 🔴 /store/mobile-bootstrap chạy production nhưng mất mã nguồn src/cloudflare/ chỉ còn __tests__ — tìm lại worker hoặc viết lại Dev backend chưa rõ 1 dòng
Tái hiện
curl "$API/store/mobile-bootstrap"   # 200, chạy tốt
ls src/cloudflare/                   # chỉ có __tests__
Nghiệm thu sau khi sửa
Có mã nguồn worker trong repo, deploy lại được
R12 🔴 App đang chạy là Speedy Chow, không phải Chagee — 33 màn thiết kế chưa khởi công Quyết định phạm vi: viết mới app Chagee, hay cải tạo app hiện tại Cần quyết định dự án 27 dòng
Tái hiện
grep -n "title: '" lib/src/app/mobile_food_delivery_app.dart:26
# title: 'Speedy Chow'
find mobile-chagee-clone/lib mobile/lib -name '*.dart'   # 0 file
Nghiệm thu sau khi sửa
Không phải bug — cần PM chốt hướng trước khi ước lượng
R13 ⚪ Xoay ngang chỉ kiểm được trên máy thật — web cố tình khoá khung 393px :3859 SpeedyPhoneFrame · cần simulator iOS hoặc máy thật QA / thiết bị 2 giờ 1 dòng
Tái hiện
// mobile_food_delivery_app.dart:3859
final tight = !kIsWeb || constraints.maxWidth <= 430;
Nghiệm thu sau khi sửa
Chạy TC-WF36 trên iPhone thật, nội dung phủ kín khi xoay ngang
R14 🟠 Lộ API Base URL ra bản khách dùng :3105 — gỡ dòng này khỏi màn Profile Dev mobile 5 phút 1 dòng
Tái hiện
// mobile_food_delivery_app.dart:3105
title: 'API Base URL'   // hiện công khai ở màn Tôi
Nghiệm thu sau khi sửa
Chạy lại TC-WF35: màn Tôi không còn dòng địa chỉ máy chủ
R15 🟠 Chuỗi hiển thị lẫn tiếng Anh trong app tiếng Việt Việt hoá: Profile · Orders · Liked · Notification · Sign In · Search… Dev mobile 1 ngày 1 dòng
Tái hiện
grep -nE "'(Orders|Liked|Notification|Profile|Sign In)'" \
  lib/src/app/mobile_food_delivery_app.dart
Nghiệm thu sau khi sửa
Chạy lại TC-WF37: không còn chuỗi tiếng Anh nào lọt ra
R16 🔴 8 nút bấm vào không có gì xảy ra — không đổi màn, không báo lỗi, không phản hồi gì Nối sự kiện bấm cho: 4 bộ lọc đơn hàng · Refresh Orders · Tải lại · Lưu · gỡ hẳn dòng API Base URL Dev mobile 1 ngày 8 dòng
Tái hiện
Mở app → tab Đơn hàng → bấm lần lượt All / Active / Completed / Cancelled
# màn hình không đổi, nút không sáng lên, danh sách không lọc

Đăng nhập → tab Tôi → sửa tên → bấm "Lưu"
# không có gì xảy ra, không báo thành công cũng không báo lỗi
Nghiệm thu sau khi sửa
Chạy lại TC-UI01TC-UI08: mỗi nút phải đổi trạng thái nhìn thấy được, hoặc hiện thông báo cho khách biết đã bấm trúng
R17 🟠 4 màn mở ra không có tiêu đề — khách không biết đang ở đâu, không có nút quay lại rõ ràng Thêm SpeedyHeader cho màn chi tiết món và 3 màn Đổi SĐT / email / mật khẩu Dev mobile 2 giờ 4 dòng
Tái hiện
Trang chủ → bấm thẻ "Combo Thảm Dã Ngoại"        # màn mở ra, không có tiêu đề
Đăng nhập → tab Tôi → bấm "Đổi email"           # màn mở ra, không có tiêu đề
Nghiệm thu sau khi sửa
Chạy lại TC-UI09TC-UI12: mỗi màn hiện đúng tên ở thanh trên cùng

Phase 1 — Kết quả kiểm thử (115 dòng)

Mẹo: bấm mã R… trong cột Gốc để xem hết các dòng cùng một nguyên nhân
Mục
Nguyên nhân
Ai sửa
Loại
Gốc Chức năng Kịch bản Kết quả mong đợi Kết quả thực tế Trạng thái Hình ảnh minh họa
1 · Hệ thốngmáy chủ · Admin · web · app còn sống không, và app gửi request có đúng chuẩn máy chủ nhận không12 dòng 6 đạt5 hỏng1 cảnh báo
TC-SYS01Hệ thốngHạ tầngAPIGọi GET /health trên máy chủ chínhHTTP 200HTTP 200Pass
TC-SYS02Hệ thốngHạ tầngWebMở trang AdminTrả 200 hoặc chuyển hướng đăng nhậpHTTP 302 → trang đăng nhậpPass
TC-SYS03Hệ thốngHạ tầngWebMở StorefrontHTTP 200HTTP 200Pass
TC-SYS04Hệ thốngHạ tầngWebMở Mobile web bản deployHTTP 200HTTP 200Pass
TC-SYS05R2notify chưa cấu hìnhHệ thốngHạ tầngAPIGọi dịch vụ gửi tin nhắn notify.batnuocdodi.xyzTrả 200, hoặc 401/403 khi thiếu khoáHTTP 403 {"ok":false,"error":"forbidden"} — dịch vụ vẫn sống, đòi x-notify-key. Nhưng máy chủ chính không hề gọi tới địa chỉ nàyWarning
TC-API01R1tham số platformHệ thốngTương thích APIAPIGọi POST /store/carts kèm ?platform=mobile — đúng như app gửi200, tạo được giỏ400 "Unrecognized fields: 'platform'". Bỏ tham số đó ra thì 200 ngayFail
TC-API02R1tham số platformHệ thốngTương thích APIAPIGọi GET /store/products kèm ?platform=mobile200, trả danh sách sản phẩm400 "Unrecognized fields: 'platform'"Fail
TC-API03R1tham số platformHệ thốngTương thích APIAPIGọi GET /store/regions kèm ?platform=mobile200, trả khu vực400 "Unrecognized fields: 'platform'"Fail
TC-API04Hệ thốngTương thích APIAPIGọi GET /store/mobile-menu kèm ?platform=mobile200200 — route tự viết bỏ qua tham số lạ, nên nhóm route này không bị ảnh hưởngPass
TC-API05R1tham số platformHệ thốngTương thích APIAPIQuét toàn bộ 8 route lõi Medusa mà app gọi, có và không có ?platform=mobileCả 8 đều 200 trong cả hai trường hợp8/8 hỏng khi có tham số: products · regions · shipping-options · payment-providers · POST carts · GET carts/{id} · POST carts/{id} · payment-collections — tất cả 200 → 400Fail
TC-API06Hệ thốngTương thích APIAPIQuét toàn bộ 13 route tự viết của dự án, có và không có ?platform=mobileKhông bị ảnh hưởng bởi tham số lạ13/13 giữ nguyên kết quảmobile-bootstrap, mobile-menu, sales-policy, stores, stores/nearest, google/config, account/me, account/orders, account/loyalty, vnpay/status, promotion-engine/evaluate, promotion-engine/apply, payment/vnpayPass
TC-WF38R12app không phải ChageeHệ thốngDự ánMã nguồnKiểm 3 thư mục app trong dự ánApp Chagee có mã nguồn và chạy đượcmobile-food-delivery có mã nguồn nhưng là app "Speedy Chow" giao đồ ăn. mobile-chagee-clonemobile đều 0 file .dart — 13 màn Chagee chưa được khởi côngFail
2 · Dữ liệu nềntrong hệ thống đã có đủ sản phẩm, giá, cửa hàng, khu vực, cách giao hàng, tuỳ chọn món chưa12 dòng 6 đạt2 hỏng4 cảnh báo
TC-DAT01Dữ liệu nềnDữ liệuAPIGET /store/products?limit=100Có danh sách sản phẩm200 — 100 sản phẩmPass
TC-DAT02Dữ liệu nềnDữ liệuAPIGET /store/mobile-menuCó thực đơn cho app200 — item_count: 43Pass
TC-DAT03Dữ liệu nềnDữ liệuAPIGET /store/regionsCó khu vực dùng tiền VND200 — 2 khu vực, có VNDPass
TC-DAT04R7thiếu dữ liệuDữ liệu nềnDữ liệuAPIGET /store/storesCó ít nhất 1 cửa hàng200 — {"count": 0}, không có cửa hàng nàoFail
TC-DAT05R3thiếu giao hàng VNDữ liệu nềnDữ liệuAPIGET /store/shipping-options?cart_id=…Có ít nhất 1 phương thức giao hàng cho VN200 — {"shipping_options": []} rỗngFail
TC-DAT06R7thiếu dữ liệuDữ liệu nềnDữ liệuAPIKiểm giá sản phẩm ở khu vực VND100/100 sản phẩm có giá99/100 có giá. Promotion E2E Coffeecalculated_price: nullWarning
TC-DAT07R11mất mã nguồnDữ liệu nềnDữ liệuAPIGET /store/mobile-bootstrapTrả cache_version + region200 — trả đủ. Nhưng src/cloudflare/ chỉ còn __tests__, mất mã nguồn workerWarning
TC-DAT08Dữ liệu nềnDữ liệuAPIGET /store/sales-policyTrả chính sách bán hàng200Pass
TC-DAT09Dữ liệu nềnDữ liệuAPIGET /store/payment-providers?region_id=…Có cổng thanh toán200 — pp_system_defaultPass
TC-DAT10Dữ liệu nềnDữ liệuAPIGET /store/stores/{id} với mã cửa hàng không tồn tại404 kèm thông báo rõ404 — {"stores":{"error":"Store not found"}}Pass
TC-DAT11R6modifiers rỗngDữ liệu nềnDữ liệuAPIGET /store/ipos-fabi/products/{id}/modifiers — lấy topping / size / mức đáTrả danh sách tuỳ chọn cho món200 nhưng modifiers: [] rỗng. Đây chính là lý do màn chi tiết món chỉ có 1 lựa chọn "Default" (xem TC-WF08, TC-WF18)Warning
TC-DAT12R7thiếu dữ liệuDữ liệu nềnDữ liệuAPIGET /store/customKhông nên tồn tại trên môi trường chạy thật200 — trả chuỗi OK. Route mẫu của Medusa còn sót trên production, chưa gỡWarning
3 · Tài khoảnđăng ký · đăng nhập (OTP, email, Google, Apple) · quên và đổi mật khẩu · đổi email/SĐT · hồ sơ · chặn người lạ xem dữ liệu42 dòng 18 đạt15 hỏng7 cảnh báo2 chưa test
TC-AUTH01R2notify chưa cấu hìnhTài khoảnĐăng nhập OTPAPIPOST /store/auth/otp/send với số hợp lệ202 + challenge_id, mã được gửi đi502 otp_display_failed"fetch failed". Máy chủ tạo được mã nhưng không gửi được rồi vứt mã điFail
TC-AUTH02R2notify chưa cấu hìnhTài khoảnĐăng nhập OTPAPIPOST /store/auth/otp/verify với mã đúng200 + token phiênKhông thực hiện được — bước gửi mã đã hỏng nên không có mã nào để nhậpChưa test
TC-AUTH03Tài khoảnĐăng kýAPIPOST /store/auth/email/register với email mới201 + token + hồ sơ khách201 — tạo tài khoản thành côngPass
TC-AUTH04Tài khoảnĐăng kýAPIĐăng ký với email đã tồn tạiTừ chối và nêu rõ lý do422 email_register_failed"Identity with email already exists"Pass
TC-AUTH05R4app nuốt lỗiTài khoảnĐăng kýMobile webBấm Đăng ký trong app với email đã tồn tạiApp hiện "Email này đã được đăng ký"App hiện "We couldn't complete that action." — nuốt mất lý do thật máy chủ đã trả vềFail
TC-AUTH06Tài khoảnĐăng kýAPIĐăng ký với mật khẩu rỗng400 nêu rõ yêu cầu mật khẩu400 invalid_email_register_payload"email and password with at least 8 characters are required"Pass
TC-AUTH07Tài khoảnĐăng kýAPIĐăng ký với tên chỉ 1 từ (last_name rỗng)Chấp nhận, không chặn201 — last_name: null, không chặnPass
TC-AUTH08Tài khoảnĐăng nhập emailAPIPOST /store/auth/email/login đúng mật khẩu200 + access_token + refresh_token200 — token 569 ký tựPass
TC-AUTH09Tài khoảnĐăng nhập emailAPIĐăng nhập sai mật khẩu401, không tiết lộ email có tồn tại hay không401 "Invalid email or password" — giống hệt nhau cho email có thật và email không tồn tạiPass
TC-AUTH10Tài khoảnĐăng nhập emailMobile webĐăng nhập trong app rồi mở màn TôiVào được hồ sơ khách200 → /account/me/account/loyalty → hiện "AUD Probe · No tier · 0 Points" + Đổi SĐT / Đổi email / Đổi mật khẩu / Đăng xuất / Xoá tài khoảnPass
TC-AUTH11R2notify chưa cấu hìnhTài khoảnQuên mật khẩuAPIPOST /store/auth/password/forgot202 kèm delivery, mã tới tay khách202 nhưng thiếu trường delivery — giả vờ thành công, mã không bao giờ được gửiFail
TC-AUTH12R2notify chưa cấu hìnhTài khoảnĐặt lại mật khẩuAPIPOST /store/auth/password/reset với mã hợp lệ200, đổi được mật khẩuKhông thực hiện được — không nhận được mã do TC-AUTH11 hỏngChưa test
TC-AUTH13R10thiếu màn hìnhTài khoảnĐặt lại mật khẩuMobile webTìm màn đặt lại mật khẩu trong appCó màn nhập mã + mật khẩu mớiKhông tồn tại — resetPassword khai báo trong tầng dữ liệu nhưng không màn hình nào gọi. "Quên mật khẩu?" là ngõ cụtFail
TC-AUTH14Tài khoảnPhiên đăng nhậpAPIPOST /store/auth/session/refresh với token rác401401 "Invalid refresh token"Pass
TC-AUTH15Tài khoảnPhiên đăng nhậpAPIPOST /store/auth/session/logout200, thu hồi phiên200 — logged_out: truePass
TC-AUTH16R9Google/AppleTài khoảnGoogleAPIGET /store/auth/google/configTrả client_id + redirect_uri đúng môi trường200 nhưng redirect_uri = http://localhost:5050 — địa chỉ máy local, không phải domain đã deployWarning
TC-AUTH17Tài khoảnGoogleAPIPOST /store/auth/google/callback với mã rác401401 "Google token exchange failed: 400"Pass
TC-AUTH18R9Google/AppleTài khoảnGoogleMobile appĐăng nhập Google trên iOS/Android thậtSau khi đồng ý, quay lại app kèm mãChưa nối deep-link nên mã không quay lại được. Chính chú thích trong mã nguồn ghi "native round-trip is not wired yet"Fail
TC-AUTH19R9Google/AppleTài khoảnAppleMobile appĐăng nhập bằng AppleCó nút và luồng hoạt độngKhông tồn tại — 0 route phía máy chủ, 0 nút phía app. Apple guideline 4.8 sẽ từ chối phát hànhFail
TC-AUTH20Tài khoảnBảo mậtAPIGET /store/account/me không kèm token401401Pass
TC-AUTH21Tài khoảnBảo mậtAPIGET /store/account/orders không kèm token401401Pass
TC-AUTH22Tài khoảnBảo mậtAPIGET /store/account/loyalty không kèm token401401Pass
TC-AUTH23Tài khoảnBảo mậtMobile webApp ở localhost:5050 gọi API khác domainPreflight cho phép204 + Access-Control-Allow-Origin: http://localhost:5050Pass
TC-AUTH24Tài khoảnHồ sơAPIGET /store/account/me có tokenTrả thông tin khách200 — đúng email đã đăng nhậpPass
TC-AUTH25Tài khoảnHồ sơAPIGET /store/account/orders có tokenTrả danh sách đơn200 — count: 0Pass
TC-AUTH26Tài khoảnHồ sơAPIGET /store/account/loyalty có tokenTrả điểm thưởng200 — 0 điểm, chưa có hạngPass
TC-AUTH27R2notify chưa cấu hìnhTài khoảnĐổi emailAPIPOST /store/account/email/change/send — gửi mã xác thực để đổi email202, mã tới tay khách502 email_change_otp_failed"fetch failed". Cùng gốc với lỗi OTP: máy chủ không gọi được dịch vụ gửi tinFail
TC-AUTH28R2notify chưa cấu hìnhTài khoảnĐổi số điện thoạiAPIPOST /store/account/phone/change/send — gửi mã xác thực để đổi SĐT202, mã tới tay khách502 phone_change_otp_failed"fetch failed". Cùng gốc với lỗi OTPFail
TC-AUTH29Tài khoảnĐổi mật khẩuAPIPOST /store/auth/password/change khi đang đăng nhập200, đổi được và thu hồi phiên cũ200 — password_changed: true, session_revoked: true. Các lời gọi sau đó bằng token cũ trả 401 customer_session_revoked, đúng chuẩn bảo mậtPass
TC-WF04R12app không phải ChageeTài khoảnĐăng nhậpMobile webMở luồng đăng nhậpBảng trượt lên từ dưới, tiêu đề "CHÀO MỪNG": chọn mã vùng +84 · số điện thoại · mã giới thiệu · nút TIẾP TỤC · icon Email / Apple · 2 ô tick đồng ý điều khoảnTrang riêng chiếm cả màn, tiêu đề "Đăng nhập": 2 nút Điện thoại/Email · ô số điện thoại không có chọn +84 · "Gửi mã OTP" · "Tiếp tục với Google". Thiếu mã giới thiệu, Apple, 2 ô tickFail
TC-WF05R12app không phải ChageeTài khoảnĐăng nhậpMobile webChọn đăng nhập bằng EmailBảng "Nhập địa chỉ email": email · mã giới thiệu · TIẾP TỤC — không dùng mật khẩuTab Email: chọn Đăng nhập/Đăng ký · email · mật khẩu · "Quên mật khẩu?" — khác hẳn mô hình thiết kếFail
TC-WF09R12app không phải ChageeTài khoảnChặn đăng nhậpMobile webBấm thêm vào giỏ khi chưa đăng nhậpBật bảng "CHÀO MỪNG" mời đăng nhậpCó chặn thật — nhưng đẩy sang trang đăng nhập riêng thay vì bảng trượt lên. Đúng logic, sai hình thứcWarning
TC-WF12R12app không phải ChageeTài khoảnTài khoảnMobile webBấm tab "Tôi" khi chưa đăng nhậpBật bảng "CHÀO MỪNG"Ra màn "Profile" · thẻ "Chào bạn 👋" · nút "Đăng nhập / Đăng ký"Fail
TC-WF13R12app không phải ChageeTài khoảnTài khoảnMobile webXem màn "Tôi" ở chế độ khách vãng laiHạng FRIEND · Tea Leaves 0 · Voucher 0 · Câu hỏi thường gặpCó "Help Center" + "API Base URL — https://24h-api.batnuocdodi.xyz". Không có FRIEND, Tea Leaves, Voucher, FAQFail
TC-WF28R12app không phải ChageeTài khoảnTài khoản (đã ĐN)Mobile webMở màn "Tôi" sau khi đăng nhậpFRIEND · hạng thành viên + tiến trình lên hạng · ô Tea Leaves / Voucher · FAQ · icon QRMàn "Profile": tên khách · No tier · 0 Points · 0 Lifetime · History · Đổi SĐT / Đổi email / Đổi mật khẩu / Đăng xuất / Xoá tài khoản. Thiếu: hạng FRIEND, tiến trình lên hạng, ô Tea Leaves/Voucher, FAQ, QRWarning
TC-WF31R12app không phải ChageeTài khoảnCài đặtMobile webMở màn Cài đặt từ icon Quốc gia · Ngôn ngữ · Quyền truy cập · Xóa tài khoản · Điều khoản · ĐĂNG XUẤTKhông có icon ⚙, không có màn Cài đặt riêng. Chỉ có Đăng xuất + Xoá tài khoản nằm rời trong màn Profile. Thiếu Quốc gia, Ngôn ngữ, Quyền truy cập, Điều khoảnWarning
TC-UI06R16nút không phản hồiTài khoảnHồ sơMobile webSửa tên rồi bấm LưuLưu thành công và báo cho khách biếtKhông có gì xảy ra — không báo thành công, không báo lỗi. Khách không biết đã lưu hay chưaFail
TC-UI07R16nút không phản hồiTài khoảnHồ sơMobile webBấm Tải lại ở màn hồ sơNạp lại thông tin từ máy chủKhông có gì xảy raFail
TC-UI08R16nút không phản hồiTài khoảnHồ sơMobile webBấm dòng API Base URLDòng này không nên bấm được — là thông tin kỹ thuậtTrông như nút bấm được nhưng bấm không làm gì. Xem thêm TC-WF35Fail
TC-UI10R17màn thiếu tiêu đềTài khoảnĐổi số điện thoạiMobile webTab Tôi → bấm Đổi số điện thoạiMàn hiện tiêu đề "Đổi số điện thoại"Màn không có tiêu đềWarning
TC-UI11R17màn thiếu tiêu đềTài khoảnĐổi emailMobile webTab Tôi → bấm Đổi emailMàn hiện tiêu đề "Đổi email"Màn không có tiêu đềWarning
TC-UI12R17màn thiếu tiêu đềTài khoảnĐổi mật khẩuMobile webTab Tôi → bấm Đổi mật khẩuMàn hiện tiêu đề "Đổi mật khẩu"Màn không có tiêu đềWarning
4 · Xem thực đơntrang chủ · danh mục · chi tiết món — so cả trước và sau khi đăng nhập12 dòng 11 hỏng1 cảnh báo
TC-WF01R12app không phải ChageeXem thực đơnMàn chàoMobile webMở app lần đầuMàn chào CHAGEE + bảng chọn quốc gia (Indonesia / Malaysia / Singapore…), bấm CONTINUEKhông có màn này — vào thẳng trang chủ. Tìm toàn bộ mã nguồn: 0 kết quả cho "select market", "country", "welcome to"Fail
TC-WF02R12app không phải ChageeXem thực đơnTrang chủMobile webXem trang chủ khi chưa đăng nhậpNút Đăng nhập · cờ VN · 2 ô lớn TỰ ĐẾN LẤY / GIAO HÀNG · 4 phím tắt (Voucher, Giới Thiệu, Sưu Tập, Calories) · 4 tab dưới"Deliver to / Select Your Location" · banner ICE CREAM DAY 40% OFF · ô Search · 8 ô danh mục · "Special Offers" · 5 tab. Thiếu nút Đăng nhập, TỰ ĐẾN LẤY/GIAO HÀNG, 4 phím tắtFail
TC-WF03R12app không phải ChageeXem thực đơnTrang chủMobile webCuộn trang chủ xuốngDải banner khuyến mãi: combo cổ điển · sưu tập tem · thưởng giới thiệuCuộn ra lưới sản phẩm. Không có banner nào trong 3 loại đóFail
TC-WF06R12app không phải ChageeXem thực đơnThực đơnMobile webMở tab "Đặt món"Thực đơn chia đôi: TỰ ĐẾN LẤY / GIAO HÀNG · chọn cửa hàng · cột danh mục bên trái + thẻ combo bên phảiKhông có tab "Đặt món". Bấm ô danh mục ở trang chủ ra lưới 2 cột, chỉ có nút Quay lại + Làm mớiFail
TC-WF07R12app không phải ChageeXem thực đơnThực đơnMobile webCuộn thực đơnDanh sách dọc: ảnh · tên · nhãn "Bestseller" · giá · nút + thêm nhanhLưới 2 cột, không có nút + trên thẻ sản phẩmFail
TC-WF08R6modifiers rỗngXem thực đơnChi tiết mónMobile webBấm vào 1 món trong thực đơnChọn Size · Mức đá · Độ ngọt · số lượng · 2 nút riêng THÊM VÀO GIỎĐẶT HÀNGChỉ có 1 lựa chọn duy nhất ghi "Default" · nút −/+ · 1 nút hiện giá tiền. Không có Size, Mức đá, Độ ngọtFail
TC-WF14R12app không phải ChageeXem thực đơnTrang chủ (đã ĐN)Mobile webXem trang chủ ngay sau khi đăng nhập"Xin chào, Friend" + chip hạng thành viên · ô Tea Leaves / Voucher · PICKUP/DELIVERY · 4 phím tắt · icon QR góc phảiTrang chủ giống hệt lúc chưa đăng nhập — vẫn "Deliver to / Select Your Location", banner kem, 8 ô danh mục. Không có lời chào, không hạng, không Tea Leaves/Voucher, không QRFail
TC-WF15R12app không phải ChageeXem thực đơnTrang chủ (đã ĐN)Mobile webCuộn trang chủ xuống sau khi đăng nhậpDanh sách banner khuyến mãi (combo · sưu tập tem · giới thiệu…)Lưới sản phẩm, giống hệt trạng thái chưa đăng nhậpFail
TC-WF16R12app không phải ChageeXem thực đơnThực đơn (đã ĐN)Mobile webMở thực đơn sau khi đăng nhậpThực đơn chia đôi + "Chuẩn bị N ly · ~N phút" (sức chứa/thời gian chờ) + "thu thập tem 0/6"Không có tab thực đơn. Không có thông tin thời gian chờ, không có temFail
TC-WF17R12app không phải ChageeXem thực đơnThực đơn (đã ĐN)Mobile webXem thực đơn dạng danh sách sau khi đăng nhậpDanh sách dọc có ảnh · tên · giá · nút thêm nhanhLưới 2 cột, không đổi so với lúc chưa đăng nhậpFail
TC-WF18R6modifiers rỗngXem thực đơnChi tiết món (đã ĐN)Mobile webBấm 1 món để tuỳ chỉnhChọn Size · Mức đá · Độ ngọt · số lượng · 2 nút Thêm vào giỏ / Đặt hàngVẫn chỉ 1 lựa chọn "Default 499,000 VND" · nút −/+ · 1 nút giá. Không đổi so với lúc chưa đăng nhậpFail
TC-UI09R17màn thiếu tiêu đềXem thực đơnChi tiết mónMobile webTừ trang chủ bấm thẻ combo để mở chi tiết mónMàn hiện tên món ở thanh trên cùngMàn không có tiêu đề — chỉ có nút Back trơnWarning
5 · Đặt đồtạo giỏ → thêm món → điền địa chỉ → chọn cách giao → bấm đặt hàng9 dòng 4 đạt5 hỏng
TC-CART01Đặt đồGiỏ hàngAPIPOST /store/carts với khu vực VNDTạo giỏ, tiền tệ vnd200 — cart_01KZ31CQ…, currency vndPass
TC-CART02Đặt đồGiỏ hàngAPIThêm 2 phần "Burger Gà Yo" (có giá) vào giỏGiỏ có 1 dòng, tổng 60.000đ200 — total = 60000, items = 1Pass
TC-CART03R8lỗi 500 khi thiếu giáĐặt đồGiỏ hàngAPIThêm món chưa gắn giá vào giỏBáo lỗi rõ: "sản phẩm chưa có giá ở khu vực này"500 unknown_error — máy chủ lỗi, không nêu lý do. Tái hiện với variant_01KWY3DTV6RDSZ885N7Q44E27HFail
TC-CART04Đặt đồĐặt hàngAPIĐiền địa chỉ giao hàng (quốc gia vn)Lưu được địa chỉ200Pass
TC-CART05R3thiếu giao hàng VNĐặt đồĐặt hàngAPILấy phương thức giao hàng cho giỏ đã có địa chỉCó ít nhất 1 lựa chọn để chọn200 — {"shipping_options": []}. Không có gì để chọnFail
TC-CART09R3thiếu giao hàng VNĐặt đồĐặt hàngAPIPOST /store/carts/{id}/completeTạo được đơn hàng400 — "No shipping method selected but the cart contains items that require shipping." KHÔNG TẠO ĐƯỢC ĐƠNFail
TC-CART10Đặt đồKhuyến mãiAPIPOST /store/promotion-engine/evaluateTrả mức giảm giá200 — totalDiscount: 0Pass
TC-CART13R1tham số platformĐặt đồGiỏ hàngMobile webBấm "Thêm vào giỏ" ngay trong app (đã đăng nhập)Tạo giỏ và thêm món vào giỏApp không tạo nổi giỏ hàng. POST /store/carts?platform=mobile400 "Invalid request: Unrecognized fields: 'platform'". Màn giỏ hiện "Create Basket" + "0 VND" + câu lỗi chung chung. Không mua được gì từ appFail
TC-WF19R1tham số platformĐặt đồGiỏ hàngMobile webBấm THÊM VÀO GIỎ HÀNG → xem giỏ trượt lênSheet giỏ hàng: "✓ 1 SẢN PHẨM" · Xóa Tất Cả · dòng món (ảnh · tên · tuỳ chọn · ✎ sửa · giá · số lượng) · thanh dưới túi + tổng tiền + KIỂM TRA LẠIKhông vào được giỏ. Màn "My Basket" hiện nút "Create Basket" + "0 VND" + câu lỗi chung chung. Nguyên nhân: POST /store/carts?platform=mobile trả 400Fail
6 · Thanh toánmở phiên thanh toán · chọn cổng · VNPay · màn quét mã QR9 dòng 3 đạt6 hỏng
TC-CART06Thanh toánThanh toánAPIPOST /store/payment-collectionsTạo phiên đúng số tiền của giỏ200 — amount = 60000Pass
TC-CART07Thanh toánThanh toánAPIChọn cổng thanh toán pp_system_defaultTạo được payment session200Pass
TC-CART08R5VNPay sai tiềnThanh toánThanh toánAPIPOST /store/carts/{id}/payment/vnpayTrả link thanh toán VNPay422 payment_creation_failed"Cart/order total must be a positive number" cart.total = 60000payment_collection.amount = 60000. Route đang đọc nhầm trườngFail
TC-CART11Thanh toánThanh toánAPIGET /store/vnpay/status?cart_id=…Trả trạng thái thanh toán200 — status: pendingPass
TC-CART12R10thiếu màn hìnhThanh toánThanh toánMobile webTìm chỗ mở link thanh toán VNPay trong appApp mở trình duyệt sang trang VNPayKhông tồn tại — createVnpayPaymentgetVnpayStatus khai báo nhưng không màn hình nào gọi. url_launcher chỉ dùng cho đăng nhập GoogleFail
TC-WF20R1tham số platformThanh toánĐặt hàngMobile webXem màn tóm tắt "Đơn hàng của bạn"Cửa hàng + địa chỉ · thời gian nhận món · tóm tắt đơn · phí bao bì · voucher · tem · chi tiết thanh toán · nút THANH TOÁNKhông tới được — chặn từ bước tạo giỏ (TC-WF19)Fail
TC-WF21R1tham số platformThanh toánThanh toánMobile webCuộn xuống phần chọn phương thức thanh toánTổng thanh toán · Thẻ Quốc tế / Thẻ Nội địa / VietQR · Liên hệ · Ghi chú đơn hàngKhông tới được — chặn từ bước tạo giỏFail
TC-WF22R1tham số platformThanh toánThanh toánMobile webKhách chưa liên kết SĐT bấm thanh toánSheet gợi ý liên kết số điện thoại để nhận voucher (+84 · SĐT · TIẾP TỤC)Không tới được — chặn từ bước tạo giỏFail
TC-WF23R1tham số platformThanh toánThanh toánMobile webThanh toán bằng quét mã QRMàn Quét mã QR: thẻ THANH TOÁN ĐA NĂNG chứa mã QR + mã giao dịch · Chia sẻ / Tải xuống · danh sách app ngân hàng hỗ trợKhông tới được — chặn từ bước tạo giỏ. Ngoài ra app cũng không có chỗ nào mở link thanh toán (xem TC-CART12)Fail
7 · Đơn hàng của tôilịch sử đơn · 4 bộ lọc trạng thái · đánh giá đơn · đặt hàng lại11 dòng 10 hỏng1 cảnh báo
TC-WF10R12app không phải ChageeĐơn hàng của tôiĐơn hàngMobile webBấm tab "Đơn hàng" khi chưa đăng nhậpBật bảng "CHÀO MỪNG"Ra màn "Orders" viết tiếng Anh · bộ lọc All/Active/Completed/Cancelled · nút "Sign In" · dòng "Sign in to view your orders."Fail
TC-WF11R12app không phải ChageeĐơn hàng của tôiĐơn hàngMobile webBỏ qua đăng nhập rồi xem danh sách đơn"KHÔNG CÓ ĐƠN HÀNG." + Bạn chưa đặt mua bất cứ thứ gì + nút Đặt ngayKhông có trạng thái rỗng này, không có nút Đặt ngayFail
TC-WF24R12app không phải ChageeĐơn hàng của tôiĐơn hàng (đã ĐN)Mobile webKhách mới chưa có đơn, mở tab Đơn hàngTrạng thái rỗng "KHÔNG CÓ ĐƠN HÀNG"Có trạng thái rỗng nhưng viết tiếng Anh: màn "Orders" · "No orders — You haven't placed any orders yet." · nút "Refresh Orders"Warning
TC-WF25R1tham số platformĐơn hàng của tôiĐơn hàng (đã ĐN)Mobile webXem đơn đã hoàn thành / bị huỷThẻ đơn: cửa hàng · ngày giờ · trạng thái · dòng món (tuỳ chọn · giá · số lượng) + 2 nút ĐÁNH GIÁ / ĐẶT HÀNG LẠIKhông kiểm được — không tạo nổi đơn nào để có dữ liệu (TC-CART09, TC-WF19)Fail
TC-WF26R12app không phải ChageeĐơn hàng của tôiĐánh giáMobile webBấm ĐÁNH GIÁ trên một đơn đã xongMàn đánh giá: cửa hàng · 5 sao · ô Thêm bình luận (0/500) · thêm ảnh 0/3 · dòng đồng ý liên hệ · nút GửiKhông tồn tại — không có màn đánh giá trong appFail
TC-WF27R12app không phải ChageeĐơn hàng của tôiĐặt lại đơnMobile webBấm ĐẶT HÀNG LẠI trên đơn cũQuay về thực đơn + giỏ hàng đã nạp sẵn món cũ, số lượng cộng dồn, tổng tiền cập nhậtKhông tồn tại — không có nút đặt lại đơnFail
TC-UI01R16nút không phản hồiĐơn hàng của tôiĐơn hàngMobile webBấm bộ lọc All ở màn Đơn hàngNút sáng lên, danh sách lọc lạiKhông có gì xảy ra — màn hình không đổi, nút không đổi trạng tháiFail
TC-UI02R16nút không phản hồiĐơn hàng của tôiĐơn hàngMobile webBấm bộ lọc ActiveNút sáng lên, chỉ hiện đơn đang xử lýKhông có gì xảy raFail
TC-UI03R16nút không phản hồiĐơn hàng của tôiĐơn hàngMobile webBấm bộ lọc CompletedNút sáng lên, chỉ hiện đơn đã xongKhông có gì xảy raFail
TC-UI04R16nút không phản hồiĐơn hàng của tôiĐơn hàngMobile webBấm bộ lọc CancelledNút sáng lên, chỉ hiện đơn đã huỷKhông có gì xảy raFail
TC-UI05R16nút không phản hồiĐơn hàng của tôiĐơn hàngMobile webBấm Refresh Orders khi đã đăng nhậpTải lại danh sách đơn, có dấu hiệu đang tảiKhông có gì xảy ra — không quay vòng, không gọi API nàoFail
8 · Khách hàng thân thiếtTea Leaves (điểm thưởng) · ví Voucher2 dòng 2 hỏng
TC-WF29R12app không phải ChageeKhách hàng thân thiếtTea LeavesMobile webỞ màn Tôi bấm ô TEA LEAVESMàn điểm: tổng điểm · Xem chi tiết · 2 tab Lịch sử Tea Leaves / Lịch sử quy đổi · lưới ưu đãi đổi điểm (có trạng thái BÁN HẾT)Không tồn tại — không có ô Tea Leaves để bấm, không có màn điểm thưởngFail
TC-WF30R12app không phải ChageeKhách hàng thân thiếtVoucherMobile webỞ màn Tôi bấm ô VOUCHERMàn voucher: nút Thêm Voucher + · lịch sử 🕐 · trạng thái rỗng "KHÔNG CÓ PHIẾU GIẢM GIÁ."Không tồn tại — không có ô Voucher, không có ví voucherFail
9 · Giao diện & điều hướngthanh tab dưới · ngôn ngữ hiển thị · xoay ngang màn hình · lộ thông tin kỹ thuật ra bản khách6 dòng 4 hỏng1 cảnh báo1 chưa test
TC-WF32R12app không phải ChageeGiao diện & điều hướngThông báoMobile webMở màn Thông báo từ icon 🔔Danh sách thông báo (nội dung để placeholder)Có màn "Notification" nhưng viết tiếng Anh, mở từ tab dưới chứ không phải icon 🔔. Nội dung rỗng: "No notifications yet — Order updates and offers will appear here when available."Warning
TC-WF33R12app không phải ChageeGiao diện & điều hướngChọn quốc giaMobile webMở bảng chọn quốc gia từ icon tròn hình cờSheet chọn quốc gia + nút GỬIKhông tồn tại — không có icon cờ, không có bảng chọn quốc gia ở bất kỳ đâuFail
TC-WF34R12app không phải ChageeGiao diện & điều hướngĐiều hướngMobile webĐếm số tab ở thanh dưới cùng4 tab: Trang chủ · Đặt món · Đơn hàng · Tôi5 tab: Trang chủ · Đơn hàng · Yêu thích · Thông báo · Tôi. Thiếu "Đặt món", thừa 2 tab và cả hai đều rỗngFail
TC-WF35R14lộ URL máy chủGiao diện & điều hướngBảo mậtMobile webKiểm thông tin kỹ thuật lộ ra bản khách dùngKhông hiển thị địa chỉ máy chủ hay thông tin gỡ lỗiMàn "Tôi" hiển thị công khai "API Base URL — https://24h-api.batnuocdodi.xyz"Fail
TC-WF36R13cần máy thậtGiao diện & điều hướngGiao diệnMobile appXoay ngang màn hìnhNội dung phủ kín màn hình, không thừa viền hai bênKhông kiểm được qua web — app cố tình khoá khung 393px khi chạy trình duyệt rộng > 430px. Cần máy thật hoặc simulator iOS. Lỗi ghi nhận 16/07 chưa thể xác nhận lạiChưa test
TC-WF37R15lẫn tiếng AnhGiao diện & điều hướngNgôn ngữMobile webKiểm ngôn ngữ hiển thị toàn appToàn bộ tiếng ViệtLẫn tiếng Anh: Profile · Orders · Liked · Notification · Sign In · Search · View All · "No favourites yet" · "Order history" · "We couldn't complete that action."Fail
Không có dòng nào khớp bộ lọc.

Phase 2 — Đối chiếu Wireframe ↔ mobile_food_delivery (lấy Chagee làm chuẩn)

Cột trái là thứ bản thiết kế Chagee yêu cầu. Cột phải là thứ app mobile_food_delivery đang có. Đối chiếu hai chiều: cái thiết kế có mà app chưa làm, và cái app có mà thiết kế không hề vẽ.

Thiếu
thiết kế có, app chưa làm
Thừa
app có, thiết kế không vẽ
Khớp
giống nhau
Khác mô hình
cả hai có nhưng làm khác
Hạng mục Wireframe · Chagee mobile_food_delivery Kết luận
1 · Thương hiệu & nhận diện
Thương hiệu appCHAGEE — trà sữaSpeedy Chow — đồ ăn nhanhSai sản phẩm
Ngôn ngữ hiển thịTiếng Việt toàn bộLẫn tiếng Anh: Profile, Orders, Liked, Sign In…Chưa Việt hoá
Lộ thông tin kỹ thuậtKhông cóDòng API Base URL — 24h-api.batnuocdodi.xyz ở màn TôiPhải gỡ trước khi phát hành
2 · Mở app lần đầu
Màn chào thương hiệuWelcome CHAGEEKhông có — vào thẳng trang chủThiếu
Chọn quốc gia (Select Market)Indonesia · Malaysia · Singapore… → CONTINUEKhông cóThiếu
Đổi quốc gia sau này (icon cờ)Sheet chọn quốc gia + nút GỬIKhông có icon cờThiếu
3 · Đăng nhập / Đăng ký
Hình thức hiển thịBottom sheet trượt lên "CHÀO MỪNG"Trang riêng chiếm cả màn "Đăng nhập"Có nhưng khác
Chọn mã vùng +84Có picker mã vùngKhông có — ô SĐT trơnThiếu
Nhập số điện thoạiKhớp
Gửi mã OTPCó nút nhưng hỏng — máy chủ trả 502Có nhưng chết
Mã giới thiệuÔ "Mã giới thiệu (tùy chọn)"Không cóThiếu
Đăng nhập bằng EmailNhập email → TIẾP TỤC (không mật khẩu)Email + mật khẩuKhác mô hình
Sign in with AppleCó icon AppleKhông có — 0 route, 0 nútThiếu · chặn App Store
Tiếp tục với GoogleKhông có trong thiết kếCó — nhưng chưa chạy trên máy thậtThừa
2 ô tick đồng ý điều khoảnThông tin tiếp thị + Điều khoản/Bảo mậtKhông cóThiếu · rủi ro pháp lý
Đăng ký bằng mật khẩuKhông có trong thiết kếCó tab Đăng kýThừa
Quên mật khẩuKhông có (thiết kế dùng OTP)Có nút nhưng ngõ cụt — không có màn đặt lạiThừa & hỏng
4 · Trang chủ
Nút Đăng nhập trên trang chủCó, trong thẻ "Chào mừng CHAGEE"Không cóThiếu
Chip quốc gia (VN + cờ)Có ở góc trênKhông cóThiếu
2 ô lớn PICKUP / DELIVERYCó, kèm nhãn NEWKhông cóThiếu
4 phím tắt: Voucher · Giới Thiệu · Sưu Tập · CaloriesCó đủ 4Không có phím nàoThiếu
Lời chào "Xin chào, Friend" (sau ĐN)Trang chủ không đổi sau khi đăng nhậpThiếu
Chip hạng thành viênCó, bấm xem quyền lợiKhông cóThiếu
Ô Tea Leaves / Voucher trên trang chủCó, hiện số dưKhông cóThiếu
Icon QR góc phảiKhông cóThiếu
Banner khuyến mãiCombo trà sữa · sưu tập tem · thưởng giới thiệuICE CREAM DAY 40% OFF · Happy mealsCó nhưng sai nội dung
Ô tìm kiếmKhông cóCó ô SearchThừa
Mục "Special Offers" + "View All"Không cóThừa
5 · Thực đơn
Tab "Đặt món"1 trong 4 tab chínhKhông có tab nàyThiếu · nặng nhất
Segment TỰ ĐẾN LẤY / GIAO HÀNGKhông cóThiếu
Chọn cửa hàng gần bạn (kèm km)Không có — dữ liệu cửa hàng cũng đang 0Thiếu
Rail danh mục dọc bên trái6 danh mụcKhông cóThiếu
Thẻ combo (tên · giá · món trong combo)Không cóThiếu
Danh sách dọc + nút + thêm nhanhKhông cóThiếu
Nhãn "Bestseller"Không cóThiếu
"Chuẩn bị N ly · ~N phút"Có (sau đăng nhập)Không cóThiếu
"Thu thập tem 0/6"Có (sau đăng nhập)Không cóThiếu
Lưới sản phẩm 2 cộtKhông cóCó, mở từ ô danh mục ở trang chủThừa
6 · Chi tiết món
Ảnh · tên · mô tả mónKhớp
Chọn Size (Lớn / Vừa)Không có — chỉ 1 lựa chọn "Default"Thiếu
Chọn Mức đá (4 mức)Không cóThiếu
Chọn Độ ngọt (4 mức)Không cóThiếu · nguồn ipos-fabi/modifiers trả rỗng
Số lượng −/+Khớp
2 nút riêng: THÊM VÀO GIỎ / ĐẶT HÀNGChỉ 1 nút hiện giá tiềnThiếu
7 · Giỏ hàng & thanh toán
Giỏ hàngSheet trượt lên đè thực đơnMàn riêng — không mở được, app trả 400 khi tạo giỏCó nhưng chết
Dòng "✓ N SẢN PHẨM" + nút Xóa Tất CảKhông cóThiếu
Sửa tuỳ chọn món trong giỏ (✎)Không cóThiếu
Thanh dưới: túi + tổng tiền + KIỂM TRA LẠIKhông cóThiếu
Màn tóm tắt "Đơn hàng của bạn"Cửa hàng · thời gian nhận · line itemKhông cóThiếu
Phí bao bìCó dòng riêngKhông cóThiếu
Áp voucher khi thanh toánKhông cóThiếu
Tem tích luỹ khi thanh toánKhông cóThiếu
Chọn phương thức: Thẻ Quốc tế · Thẻ Nội địa · VietQRKhông có màn chọnThiếu
Ghi chú đơn hàngKhông cóThiếu
Liên kết SĐT khi thanh toánSheet gợi ý +84 → TIẾP TỤCKhông cóThiếu
Màn Quét mã QR (THANH TOÁN ĐA NĂNG)QR · mã giao dịch · Chia sẻ/Tải · danh sách bankKhông có. App cũng không mở nổi link thanh toánThiếu
Nhập địa chỉ giao hàngKhông có sheet riêng (thiết kế ưu tiên tự đến lấy)DeliveryAddressSheetThừa
8 · Đơn hàng
Danh sách lịch sử đơnCó (màn "Orders")Khớp
Trạng thái rỗng"KHÔNG CÓ ĐƠN HÀNG." + Bạn chưa đặt mua gì"No orders — You haven't placed any orders yet."Có nhưng tiếng Anh
Nút "Đặt ngay" ở trạng thái rỗngKhông cóThiếu
Thẻ đơn: cửa hàng · ngày giờ · trạng tháiChưa kiểm được — không tạo nổi đơn nàoChưa xác nhận
Nút ĐÁNH GIÁ + màn đánh giá 5 saoCó · bình luận 0/500 · ảnh 0/3Không cóThiếu
Nút ĐẶT HÀNG LẠINạp sẵn món cũ vào giỏKhông cóThiếu
Màn theo dõi đơnKhông cóTrackingScreenThừa
9 · Tài khoản & khách hàng thân thiết
Hạng FRIEND + tiến trình lên hạngChỉ hiện "No tier"Thiếu
Màn Tea Leaves (điểm thưởng)Tổng điểm · 2 tab lịch sử · lưới đổi điểmChỉ hiện số "0 Points" dạng chữ, không bấm đượcThiếu
Đổi điểm lấy ưu đãi (có trạng thái BÁN HẾT)Không cóThiếu
Voucher + Thêm voucher bằng mãKhông cóThiếu
Câu hỏi thường gặp (FAQ)Không cóThiếu
Icon ⚙ + màn Cài đặt (Quốc gia · Ngôn ngữ · Quyền · Điều khoản)Không có màn Cài đặtThiếu
Đăng xuấtTrong màn Cài đặtNằm rời trong màn ProfileCó nhưng khác vị trí
Xoá tài khoảnTrong màn Cài đặtNằm rời trong màn ProfileCó nhưng khác vị trí
Đổi số điện thoại / email / mật khẩuKhông có trong thiết kếCó 3 mục — nhưng đổi SĐT và email đều lỗi 502Thừa & hỏng
Thông báoMở từ icon 🔔 trong màn TôiLà 1 tab dưới, viết tiếng AnhCó nhưng khác vị trí
Tab "Yêu thích"Không cóCó — nội dung rỗngThừa
Help CenterKhông cóCó — mô tả ghi "Speedy Chow support"Thừa
Màn "Discounts" · "My Locations" · "Basket unavailable"Không cóCó cả 3Thừa
10 · Thanh tab dưới cùng
Trang chủKhớp
Đặt mónKhông cóThiếu · tab quan trọng nhất
Đơn hàngCó — ghi "Orders"Khớp, sai ngôn ngữ
TôiCó — ghi "Profile"Khớp, sai ngôn ngữ
Yêu thíchKhông cóThừa
Thông báoKhông có ở vị trí tabThừa
11 · Hạng thành viên — CHAGEE Rewards (wireframe bổ sung 03/08/2026)
Hệ thống hạng thành viên4 hạng: CHA Seeker · CHA Explorer · CHA Pioneer · CHA MasterKhông có khái niệm hạng. Màn Tôi chỉ hiện No tierThiếu
Đơn vị tích luỹ CUPsSeeker 0–10 · Explorer 10–40 · Pioneer 40–80 · Master ≥80 CUPs. Voucher đồ uống miễn phí không tính CUPsChỉ có 0 Points · 0 Lifetime dạng chữ, không có CUPsThiếu
Thẻ hạng + hạn hiệu lựcThẻ màu theo hạng · “Có giá trị cho đến 05/07/2027” · avatarKhông có thẻ hạngThiếu
Thanh tiến trình lên hạngThanh tiến trình + “( N ) CUPs cần thu thập thêm để lên hạng ( hạng kế )”Không cóThiếu
Vuốt ngang xem 4 hạngCarousel: vuốt trái/phải để xem quyền lợi từng hạngKhông cóThiếu
Quyền lợi từng hạngNgày Thành Viên giảm 15% · Quà Tặng Sinh Nhật 1x free 1 ly · Quyền Lợi Thăng Hạng 1x giảm 50%Không có quyền lợi nàoThiếu
Sheet “Quy định hạng thành viên”Chương trình CHAGEE Rewards · điều kiện thăng hạng · hiệu lực · mở từ icon Không cóThiếu
Trạng thái rỗng của hạng“Nâng cấp lên hạng để tận hưởng thêm nhiều Quyền lợi thành viên”Không cóThiếu
Mã QR thành viênPopup: “HIỂN THỊ MÃ THÀNH VIÊN TẠI CỬA HÀNG ĐỂ THU THẬP THÊM TEA LEAVES” · làm mới 30 giây một lầnKhông có icon QR, không có mã thành viênThiếu
3 icon đầu màn Tôi (quyền lợi) · (cài đặt) · 🔔 (thông báo)Không có icon nào ở đầu màn ProfileThiếu
Số điện thoại hiển thị che bớt+84 862****26 ngay dưới tên hạng FRIENDKhông hiện số điện thoại ở màn TôiThiếu
12 · Hồ sơ cá nhân (wireframe bổ sung 03/08/2026)
Màn “Cá nhân” gom 7 trườngTên · Chụp ảnh · Số điện thoại · Giới tính · Sinh nhật · Email · Khu vực đăng ký — vào từ Tôi → FRIENDKhông có màn gom. Các mục nằm rời trong ProfileThiếu
Đổi TênSheet riêng để sửa tênCó ô nhập tên + nút Lưu — nhưng nút Lưu bấm không có gì xảy ra (xem TC-UI06)Có nhưng hỏng
Ảnh đại diệnSheet “Chụp ảnh” để đặt ảnh đại diệnKhông cóThiếu
Đổi Số điện thoạiSheet riêng, xác thực trước khi đổiCó màn nhưng lỗi 502 khi gửi mã (xem TC-AUTH28) · màn không có tiêu đềCó nhưng hỏng
Giới tínhSheet chọn: Không muốn tiết lộ · Nam · Nữ · Khác → nút GỬIKhông cóThiếu
Sinh nhậtSheet chọn năm/tháng/ngày · chỉ chọn được 1 lần, không đổi được sau khi GỬIKhông cóThiếu
Đổi EmailSheet riêng, xác thực trước khi đổiCó màn nhưng lỗi 502 khi gửi mã (xem TC-AUTH27) · màn không có tiêu đềCó nhưng hỏng
Khu vực đăng kýHiện “Việt Nam” — chỉ đọc, không sửa đượcKhông cóThiếu
Đọc bảng này thế nào: app không phải làm thiếu vài màn Chagee — nó là một app khác đã hoàn chỉnh cho nghiệp vụ khác (giao đồ ăn), tình cờ trùng vài màn cơ bản. Những mục "chỉ app có" phần lớn không phải rác: chúng là phần hợp lý của app giao đồ ăn. Vì vậy chi phí không nằm ở "bổ sung phần còn thiếu", mà ở quyết định phạm vi: viết mới app Chagee, hay cải tạo app hiện tại (bỏ phần thừa · sửa phần khác · thêm phần thiếu).

Kết luận

Chặn phát hành

  • App không tạo nổi giỏ hàng — nặng nhất. App gắn ?platform=mobile vào mọi lời gọi, mà route lõi Medusa từ chối tham số lạ và trả 400. Hậu quả: không thêm được món, không mua được gì, và toàn bộ 10 màn giỏ/thanh toán trong thiết kế không tới được (TC-CART13, TC-API01TC-API03, TC-WF19TC-WF23). Sửa: bỏ _platformQuerymedusa_mobile_api.dart:58 — đã có sẵn header x-24h-platform làm đúng việc này.
  • Không tạo được đơn hàng — khu vực Việt Nam không có phương thức giao hàng nào, nên bước cuối bị chặn cứng (TC-CART05, TC-CART09).
  • Đăng nhập bằng OTP chết hoàn toàn — máy chủ không biết địa chỉ dịch vụ gửi tin nhắn. Cùng một ô cấu hình bỏ trống này làm chết 4 chức năng: đăng nhập OTP, quên mật khẩu, đổi email, đổi số điện thoại (TC-AUTH01).
  • VNPay đọc nhầm số tiền — báo "tổng tiền phải lớn hơn 0" dù giỏ có 60.000đ (TC-CART08).
  • App đang chạy không phải app trong thiết kế — thiết kế vẽ Chagee, app thật là "Speedy Chow" (TC-WF38).
  • Thiếu đăng nhập bằng Apple — Apple guideline 4.8 sẽ từ chối (TC-AUTH19).

Việc chỉ cần nhập dữ liệu, không cần lập trình viên

  • Tạo phương thức giao hàng cho khu vực Việt Nam — quan trọng nhất, làm xong là khách đặt được hàng.
  • Điền địa chỉ dịch vụ gửi tin nhắn: Admin → Settings → Integration Settings → mục "Mock Notify display endpoint" → bật trạng thái active.
  • Tạo dữ liệu cửa hàng (hiện đang 0 cửa hàng).
  • Gỡ hoặc gắn giá cho sản phẩm test cũ Promotion E2E Coffee.

Phần chạy tốt

  • Đăng nhập bằng email + mật khẩu chạy hoàn hảo, đã thử thật trên app và vào được hồ sơ (TC-AUTH10).
  • Chặn truy cập dữ liệu khách khác hoạt động đúng — 3/3 route trả 401 khi không có token (TC-AUTH20TC-AUTH22).
  • Giỏ hàng, tính tiền, phiên thanh toán đều đúng số tiền (TC-CART01, TC-CART02, TC-CART06).

Vấn đề khiến khó tìm ra lỗi

  • App hiện cùng một câu tiếng Anh cho mọi loại lỗi, và bản phát hành không ghi lại nhật ký nào. Máy chủ trả về lý do chính xác nhưng app vứt đi (TC-AUTH05).
  • /store/mobile-bootstrap đang chạy trên production nhưng không còn mã nguồn trong dự án (TC-DAT07).
  • Cách kiểm màn hình ngang mà quy định dự án đưa ra không thể phát hiện được lỗi nó đang truy (TC-WF36).

Dữ liệu thử đã tạo trên máy chủ dev

  • 2 tài khoản: aud007-probe-20260803@example.com, aud007-probe-b-20260803@example.com
  • 5 giỏ hàng thử + 1 phiên thanh toán. Không có đơn hàng nào được tạo.
  • Chưa xoá — chờ xác nhận.