Audit giao hàng / đặt hàng · 2026-08-19
Domain: D-DELIVERY · D-FNB · D-GROCERY · WP: WP-DELIVERY-AUDIT-01 (audit, không implement)
Surfaces: CON (mobile/) · DRV (driver/) · API (api/src/modules/delivery + orders) · PAR (FNB kitchen only) · ADM (capability tài xế)
0. Verdict
Hai luồng tách entity đúng (không nhét đồ ăn vào Ride):
| Ý định | Entity | Home CON | Matching | GPS live | Thanh toán | Push notif |
|---|---|---|---|---|---|---|
| Bưu kiện A→B («Đặt hàng») | DeliveryOrder |
Ô Đặt hàng → DeliveryHome |
Auto 8 km + DRV nhận | Có WS /delivery |
Chưa (DELIVERY_PAY chết) |
Không |
| Đồ ăn / siêu thị | Order + Merchant |
Ăn uống / Siêu thị | Auto 8 km lúc PAR nhận | Không (poll 12s) | Ví/ORDER_CHECKOUT |
order.* |
Bưu kiện = IMP vận hành được (đặt → ghép → map → lấy/giao → ảnh). Chưa ngang gọi xe: giá chim bay, không thu tiền, không push, ETA sai, WS không emit khi ghép tài xế.
Nhà thuốc filter «Giao hàng» không dùng DeliveryOrder.
1. Bưu kiện — contract hiện tại
Swagger tag delivery · 11/11 IMP · 0 STUB.
| Method | Path | Ai | Việc |
|---|---|---|---|
| POST | /delivery/quote |
public | Phí haversine · min 15.000đ · 5.000đ/km |
| POST | /delivery/orders |
USER | Tạo NEW + auto-match |
| GET | /delivery/orders/me |
USER | 50 đơn gần nhất |
| GET | /delivery/orders/:id |
USER hoặc driver | Chi tiết + driverBrief |
| GET | /delivery/orders/:id/tracking |
USER hoặc driver | Timeline 4 bước + GPS lastLat |
| PATCH | /delivery/orders/:id/status |
USER | Chỉ CANCELLED |
| GET | /delivery/driver/available |
DRIVER + cap DELIVERY |
Đơn chưa ghép ≤8 km |
| GET | /delivery/driver/active |
DRIVER | Đơn đang chạy |
| POST | /delivery/driver/:id/accept |
DRIVER | Nhận tay |
| POST | /delivery/driver/:id/picked |
DRIVER | + imageUrl? |
| POST | /delivery/driver/:id/delivered |
DRIVER | + imageUrl? |
WS (không nằm OpenAPI): namespace /delivery · delivery:join · delivery:location (driver) · delivery:status.
Prisma delivery_orders: pickup/dropoff + fee + 3 URL ảnh + driverId + paymentIntentId (luôn null).
Trạng thái: NEW → PICKED → DELIVERED · hủy từ NEW/QUOTED/PICKED. QUOTED không bao giờ được ghi.
2. CON — Đặt hàng / theo dõi
| Màn | File | Việc |
|---|---|---|
| Home tile | serviceCatalog id=delivery · BirdParcelIcon |
«Đặt hàng» |
| Đặt | DeliveryHomeScreen |
GPS lấy · autocomplete/ghim giao · ảnh hàng · quote · tạo đơn |
| List | DeliveryOrdersScreen |
GET /orders/me |
| Track | DeliveryDetailScreen |
Mapbox + polyline phase · timeline · gọi tài xế · hủy · WS GPS |
Luồng đặt: GPS pickup → tìm/ghim dropoff → POST /quote → POST /orders → DeliveryDetail. Guard FE: hai điểm ≥80 m.
Lệch giá / map: map vẽ tuyến Mapbox/OSRM; phí BE vẫn haversine (đã ghi trong WP-FE-DELIVERY-MAPBOX-01). Cùng tuyến Bến Thành→Landmark: road ~4.7 km vs chim bay ~3.1 km → phí thấp hơn đường thật.
Kill app: BE giữ đơn. CON không có banner «đơn giao đang chạy» trên Home (Ride có liveRide). Phải vào list/clipboard.
3. DRV — bưu kiện
- Home: card đơn mới / đang chạy · capability
DELIVERY. DeliveryInTripScreen: map full · emit GPS · slide lấy/giao · ảnh tuỳ chọn.acceptParcelkhôngonOpenParcel→ tài xế nhận xong vẫn ở Home, phải bấm «Mở in-trip».- Thu nhập hôm nay không cộng
feeAmountbưu kiện (chỉDriverApi.earnings= Ride).
4. FNB / grocery shipper (WP-FNB-COURIER-01)
- Gán
Order.driverIdsau PAR nhận · capCOURIER· bán kính 8 km quanh quán. - Pharmacy không gán shipper (
COURIER_MERCHANT_KINDS= FNB+GROCERY). - CON
OrderTrackScreen: timeline + tên shipper · không map · poll 12s · không WS. - DRV: lấy/giao trên Home card · không màn in-trip riêng.
- Docs
MOBILITY-MATRIX+STATUSdòng match vẫn ghi «chưa GPS WS» — đúng cho FNB, sai cho bưu kiện (bưu kiện đã có WS).
5. Lỗi / gap (ưu tiên)
P0 — vận hành tiền / định giá
PaymentPurpose.DELIVERY_PAYtồn tại, không ai gọi.paymentIntentIdluôn null. Đặt hàng = miễn phí trên hệ thống (COD miệng).- Quote chim bay trong khi map/routing đã có road. Ride đã sửa (
smoke:ridecheck 3). Delivery chưa.
P1 — realtime / UX trip
tryAutoAssignvàdriverAcceptkhôngemitStatus. CON chỉ biết tài xế khi refresh / poll 30s. Ride emit ngay khi match.GET trackingkhông đọc cache WS — chỉdriverProfile.lastLat(ping có persist, nhưng chậm hơn WS).- ETA luôn ~3 phút.
Math.round(distanceMeters / 500 / 60)rồimax(3, …). Đúng thì/ 500(m/phút) không chia thêm 60. - CON Home không banner đơn giao live.
- DRV nhận đơn không mở in-trip tự động.
P2 — product / ops
- Không push
delivery.*(khácorder.*/ride.*). - Không SĐT/tên người nhận (chỉ địa chỉ + note).
- Hủy được lúc
PICKED(hàng đã trên xe). - Không chat đơn giao · không ADM list
DeliveryOrder· PAR không đụng bưu kiện (đúng P2P). - Không
smoke:delivery(Ride cónpm run smoke:ride). - Race
tryAutoAssign:updatekhôngwhere: { driverId: null }→ hai driver có thể ghi đè. - Figma
SCR-DELIVERY-*= VISUAL_PARTIAL (không JPG dedicated).
6. Docs lệch code
| Nguồn | Ghi | Thực tế 2026-08-19 |
|---|---|---|
MOBILITY-MATRIX §5 |
Delivery «Chưa GPS WS live» | WS /delivery IMP |
STATUS dòng MATCH-01 |
«chưa GPS WS» | Cùng file dòng GPS-LIVE-01 đã IMP |
| Matrix #36 | 11 ops · Mapbox | Đúng REST; WS không đếm |
| WP-FE-DELIVERY-ORDER-01 Next | WP-DELIVERY-GPS-LIVE-01 |
Đã làm |
7. Test hiện có
| Suite | Phạm vi |
|---|---|
delivery-match.spec.ts |
Rank 8 km |
delivery-tracking.spec.ts |
Timeline thuần |
deliveryOrder.test.ts (mobile) |
Guard điểm + body |
mapboxTiles.test.ts |
URL raster |
order-courier.spec.ts |
FNB snapshot dropoff |
| Không | HTTP smoke quote→create→match→pick→deliver |
8. Next (không invent trong audit)
OWNER Pay/SMS/MoMo vẫn là gate P7. Nếu làm delivery tiếp (cần approvedWp):
| WP đề xuất | Việc |
|---|---|
WP-DELIVERY-QUOTE-ROAD-01 |
Quote + distanceMeters theo Mapbox/OSRM như Ride |
WP-DELIVERY-PAY-01 |
Wire DELIVERY_PAY / ví / CASH |
WP-DELIVERY-WS-ASSIGN-01 |
emit khi match/accept + tracking đọc cache GPS |
WP-DELIVERY-ETA-FIX-01 |
Sửa / 500 / 60 |
WP-FNB-COURIER-GPS-01 |
WS + map track đồ ăn (còn gap STATUS) |
WP-SMOKE-DELIVERY-01 |
Clone smoke:ride |
Domain: D-DELIVERY · D-FNB
WP: WP-DELIVERY-AUDIT-01
Surfaces: CON|DRV|API (PAR FNB kitchen · ADM capability)
Status: IMP (bưu kiện vận hành) · PARTIAL (pay/quote/notif/FNB-GPS)
Local: N/A (audit tĩnh)
Next: OWNER Pay/SMS/MoMo · hoặc approvedWp quote-road / pay