608 lines
33 KiB
JSON
608 lines
33 KiB
JSON
{
|
|
"unit": "MD",
|
|
"roles": ["PM", "BA", "SA", "UIUX", "BE", "FE", "QA", "DEVOPS"],
|
|
"items": [
|
|
{
|
|
"id": "WBS-01",
|
|
"name": "Thiết lập dự án & môi trường (Dev/Staging/Production trên AWS)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.2", "§3.3"],
|
|
"complexity": "L",
|
|
"risk": "medium",
|
|
"effortMD": { "PM": 2, "SA": 2, "BE": 5, "DEVOPS": 20 },
|
|
"rationale": "3 môi trường tách biệt (Dev/Staging/Production Multi-AZ), VPC/network, WAF/ALB, khung API Gateway + 3 BFF (Customer/Seller/Admin) theo §3.2/§3.3.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-02",
|
|
"name": "Pipeline CI/CD (build → test → SAST/SCA → deploy nhiều môi trường)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§9.3"],
|
|
"complexity": "L",
|
|
"risk": "medium",
|
|
"effortMD": { "DEVOPS": 18, "QA": 4 },
|
|
"rationale": "Pipeline nhiều bước cho ~11 service độc lập, cổng phê duyệt thủ công trước Production, canary rollout theo §9.3.1/9.3.2.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-03",
|
|
"name": "Kiến trúc nền tảng dịch vụ & event backbone (Kafka/MSK, database-per-service)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.1", "§3.2"],
|
|
"complexity": "XL",
|
|
"risk": "high",
|
|
"effortMD": { "PM": 2, "SA": 15, "BE": 25, "DEVOPS": 10 },
|
|
"rationale": "Scaffolding cho ~11 service theo bounded-context, thiết lập message broker cho các luồng saga (OrderPlaced→PaymentConfirmed→CommissionCalculated...), database-per-service trên RDS Multi-AZ.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-04",
|
|
"name": "Design system & khung i18n/l10n (5 ngôn ngữ) cho toàn bộ UI",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§7.0", "FR-15", "NFR-06"],
|
|
"complexity": "L",
|
|
"risk": "medium",
|
|
"effortMD": { "UIUX": 15, "FE": 12 },
|
|
"rationale": "Component library dùng chung cho 32 màn hình (SCR-01..SCR-32), LanguageSwitcher/CurrencyToggle, layout co giãn cho ZH/KO/JA.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-05",
|
|
"name": "Bảo mật xuyên suốt (OWASP, chống IDOR, mã hoá KMS, MFA, audit log)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§8", "§4.1.1", "§4.1.13", "§9.1.5"],
|
|
"complexity": "XL",
|
|
"risk": "high",
|
|
"effortMD": { "SA": 10, "BE": 20, "QA": 8, "DEVOPS": 5 },
|
|
"rationale": "Middleware ownership/IDOR toàn API, mã hoá at-rest KMS cho KYC/PII, hạ tầng MFA (TOTP), Audit & Compliance Service (audit_log polymorphic), account lockout policy §8.1.1a.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-06",
|
|
"name": "Hiệu năng & khả năng mở rộng (cache Redis, CDN, load/chaos test)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["NFR-01", "NFR-02", "NFR-03", "§9.1.4"],
|
|
"complexity": "L",
|
|
"risk": "high",
|
|
"effortMD": { "BE": 10, "DEVOPS": 10, "QA": 8 },
|
|
"rationale": "Cache Redis/CDN CloudFront, cấu hình hấp thụ tải qua queue, kịch bản load test flash sale (chục nghìn concurrent) và chaos/failover test theo §9.1.4.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-07",
|
|
"name": "Giám sát, logging tập trung & DR/backup",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§9.4", "§9.5", "§5.3.2"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "DEVOPS": 12, "BE": 3 },
|
|
"rationale": "CloudWatch/APM, alert theo NFR, PII masking log, PITR/backup cross-region cho service tài chính, runbook rollback/DR.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-08",
|
|
"name": "Quản lý dự án & PMO (ceremonies, báo cáo, rủi ro/thay đổi)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["bid-config methodology", "§9"],
|
|
"complexity": "L",
|
|
"risk": "medium",
|
|
"effortMD": { "PM": 40 },
|
|
"rationale": "Điều phối Agile/Scrum hybrid xuyên suốt dự án quy mô lớn (~9-12 tháng giả định #7 §1.4), quản lý rủi ro/thay đổi/cấu hình, báo cáo tiến độ.",
|
|
"assumptions": ["Số MD dựa trên giả định thời lượng dự án ~9-12 tháng (giả định #7 SAD §1.4); cần điều chỉnh khi chốt timeline thực tế."]
|
|
},
|
|
{
|
|
"id": "WBS-09",
|
|
"name": "Đào tạo & bàn giao (tài liệu vận hành, workshop Admin/Seller/CSR/Ops)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["B9 dossier-structure", "bid-config warrantyMonths"],
|
|
"complexity": "M",
|
|
"risk": "low",
|
|
"effortMD": { "BA": 5, "PM": 5, "QA": 3 },
|
|
"rationale": "Tài liệu vận hành/bàn giao, đào tạo trực tiếp cho các nhóm người dùng nội bộ (Admin, Ops, CSR) và hướng dẫn Seller.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-10",
|
|
"name": "Hỗ trợ go-live & bảo hành giai đoạn đầu (hypercare)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["bid-config warrantyMonths=12", "NFR-08"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "PM": 3, "BE": 6, "QA": 4, "DEVOPS": 8 },
|
|
"rationale": "Hỗ trợ vận hành tăng cường giai đoạn đầu sau go-live, escalation 24/7 cho sự cố nghiêm trọng theo NFR-08; nằm trong 12 tháng bảo hành theo bid-config.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-11",
|
|
"name": "Tích hợp VNPay (redirect + IPN, chống replay, đối soát)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "§4.1.6", "TC-09", "TC-10"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BE": 6, "QA": 3 },
|
|
"rationale": "Adapter redirect/callback, idempotency theo gatewayTransactionRef, job đối soát định kỳ.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-12",
|
|
"name": "Tích hợp Momo (redirect + IPN, chống replay, đối soát)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "§4.1.6"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BE": 5, "QA": 2 },
|
|
"rationale": "Tương tự VNPay, tái sử dụng phần lớn khung chống replay/đối soát đã xây ở WBS-11.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-13",
|
|
"name": "Tích hợp GHN (tạo vận đơn, webhook, retry)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "§4.1.12", "TC-29"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BE": 5, "QA": 2 },
|
|
"rationale": "Adapter tạo vận đơn/tra cứu/webhook idempotent, timeout 8s + retry 3 lần theo §3.4.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-14",
|
|
"name": "Tích hợp GHTK (tạo vận đơn, webhook, fallback từ GHN)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "§4.1.12", "BR-15", "TC-29b"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BE": 4, "QA": 2 },
|
|
"rationale": "Adapter tương tự GHN, thêm logic fallback chéo GHN↔GHTK theo BR-15.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-15",
|
|
"name": "Tích hợp Email/SMS Provider (SES/SNS hoặc nhà cung cấp nội địa)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "Notification Service §3"],
|
|
"complexity": "S",
|
|
"risk": "low",
|
|
"effortMD": { "BE": 4, "QA": 2 },
|
|
"rationale": "Gửi bất đồng bộ qua queue, retry exponential backoff, dead-letter queue cho lỗi gửi.",
|
|
"assumptions": ["Nhà cung cấp SMS/Email cụ thể chưa chốt (đề xuất SES/SNS) — xem openQuestions."]
|
|
},
|
|
{
|
|
"id": "WBS-16",
|
|
"name": "Tích hợp Google/Facebook OAuth (đăng nhập mạng xã hội)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "§4.1.3", "TC-03"],
|
|
"complexity": "S",
|
|
"risk": "medium",
|
|
"effortMD": { "BE": 4, "QA": 2 },
|
|
"rationale": "Authorization Code flow, xác thực state chống CSRF, luồng không auto-merge tài khoản trùng email (409 ERR_ACCOUNT_LINK_REQUIRED).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-17",
|
|
"name": "Tích hợp ngân hàng cho payout (batch file/API, không tự động retry)",
|
|
"group": "Xuyên suốt",
|
|
"sources": ["§3.4", "§4.1.8", "TC-25b"],
|
|
"complexity": "M",
|
|
"risk": "high",
|
|
"effortMD": { "BE": 6, "QA": 3 },
|
|
"rationale": "Sinh batch file chuẩn ngân hàng (giả định NAPAS) hoặc gọi API đối tác, xử lý trạng thái thất bại yêu cầu retry thủ công để tránh double-payout.",
|
|
"assumptions": ["Ngân hàng đối tác và chuẩn kết nối (batch file/API) chưa chốt theo SAD §9.7 — effort có thể thay đổi khi có quyết định cụ thể."]
|
|
},
|
|
{
|
|
"id": "WBS-18",
|
|
"name": "Định danh & tài khoản khách hàng (đăng ký/đăng nhập, hồ sơ & địa chỉ)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-01", "FR-02", "FR-03", "§4.1.3", "SCR-08", "SCR-09"],
|
|
"complexity": "L",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 3, "SA": 2, "BE": 12, "FE": 10, "UIUX": 4, "QA": 5 },
|
|
"rationale": "11 endpoint Identity Service (register/login/refresh/logout/profile/address), 2 màn hình wizard tab đăng nhập/đăng ký + hồ sơ/sổ địa chỉ.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-19",
|
|
"name": "Danh mục & tìm kiếm sản phẩm đa seller (Catalog + Search subsystem)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-04", "§3.1 Catalog & Search", "§4.1.4", "SCR-01", "SCR-02", "SCR-03"],
|
|
"complexity": "XL",
|
|
"risk": "high",
|
|
"effortMD": { "BA": 4, "SA": 3, "BE": 20, "FE": 15, "UIUX": 6, "QA": 8 },
|
|
"rationale": "Mô hình Product/ProductVariant/Category, tích hợp OpenSearch cho tìm kiếm/lọc đa chiều, 3 màn hình chính (trang chủ, kết quả tìm kiếm, chi tiết sản phẩm) đáp ứng NFR-01 (<2s).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-20",
|
|
"name": "Giỏ hàng đa seller (Cart Service)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-05", "§4.1.5", "SCR-04"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "BE": 8, "FE": 6, "UIUX": 2, "QA": 4 },
|
|
"rationale": "Giỏ hàng nhóm theo seller, hỗ trợ Guest qua X-Guest-Session-Id, cache Redis độ trễ thấp.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-21",
|
|
"name": "Checkout & tách đơn theo seller (saga đặt hàng)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-06", "§6 Luồng 1", "BR-01", "BR-02", "SCR-05", "SCR-06", "SCR-07"],
|
|
"complexity": "XL",
|
|
"risk": "high",
|
|
"effortMD": { "PM": 2, "BA": 4, "SA": 3, "BE": 18, "FE": 12, "UIUX": 4, "QA": 10 },
|
|
"rationale": "Nghiệp vụ phức tạp nhất: giữ tồn kho, tách 1 Order thành nhiều OrderSeller, idempotency checkout, 3 màn hình (checkout/thanh toán/xác nhận).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-22",
|
|
"name": "Thanh toán — business logic Payment Service (khởi tạo, tra cứu, COD, đối soát)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-07", "§3 Payment Service", "§4.1.6", "NFR-05", "SCR-06"],
|
|
"complexity": "L",
|
|
"risk": "high",
|
|
"effortMD": { "PM": 1, "BA": 2, "SA": 2, "BE": 12, "FE": 4, "QA": 6 },
|
|
"rationale": "Logic cô lập thanh toán (giảm phạm vi PCI-DSS), xử lý COD nội bộ, job đối soát định kỳ; không gồm adapter cổng cụ thể (xem WBS-11/12).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-23",
|
|
"name": "Quản lý đơn hàng khách hàng (tạo, theo dõi, huỷ)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-08", "§4.1.5", "SCR-10"],
|
|
"complexity": "M",
|
|
"risk": "low",
|
|
"effortMD": { "BA": 2, "BE": 6, "FE": 6, "QA": 3 },
|
|
"rationale": "Danh sách/chi tiết đơn với timeline trạng thái, điều kiện huỷ theo BR-10.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-24",
|
|
"name": "Đổi trả & khiếu nại (khởi tạo từ khách hàng)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-09", "§4.1.5", "SCR-11"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "BE": 6, "FE": 5, "UIUX": 2, "QA": 3 },
|
|
"rationale": "Form đổi trả kèm upload minh chứng, liên kết PayoutHold sang disputed_frozen (BR-14a).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-25",
|
|
"name": "Danh sách yêu thích (Wishlist)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-10", "SCR-12"],
|
|
"complexity": "S",
|
|
"risk": "low",
|
|
"effortMD": { "BE": 2, "FE": 2, "QA": 1 },
|
|
"rationale": "CRUD đơn giản, ràng buộc UNIQUE customer_id/product_id.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-26",
|
|
"name": "Đánh giá & nhận xét sản phẩm",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-11", "SCR-13", "BR-11"],
|
|
"complexity": "S",
|
|
"risk": "low",
|
|
"effortMD": { "BE": 3, "FE": 3, "QA": 2 },
|
|
"rationale": "Chỉ cho phép đánh giá khi đơn đã giao, 1 lần/order_item.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-27",
|
|
"name": "Thông báo đơn hàng (Notification Service + trung tâm thông báo in-app)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-12", "§3 Notification Service", "SCR-15"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 1, "BE": 6, "FE": 3, "QA": 3 },
|
|
"rationale": "Consumer sự kiện domain (OrderPlaced, PaymentConfirmed...) gửi email/SMS không chặn luồng chính; SCR-15 là bổ sung giả định cần BA xác nhận.",
|
|
"assumptions": ["SCR-15 (trung tâm thông báo trong-app) là giả định bổ sung của thiết kế, chưa xác nhận có bắt buộc ở MVP hay không (SAD §7.3)."]
|
|
},
|
|
{
|
|
"id": "WBS-28",
|
|
"name": "Khuyến mãi & mã giảm giá (cấu hình Admin + áp dụng khách hàng)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-13", "§3 Promotion & Loyalty", "SCR-26"],
|
|
"complexity": "M",
|
|
"risk": "low",
|
|
"effortMD": { "BA": 2, "BE": 6, "FE": 5, "UIUX": 2, "QA": 3 },
|
|
"rationale": "CRUD coupon phía Admin (SCR-26) và áp dụng tại checkout (BR-09), UNIQUE theo (promotion_id, order_id).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-29",
|
|
"name": "Chương trình loyalty & hạng thành viên",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-14", "§3 Promotion & Loyalty", "SCR-14", "BR-06", "BR-07", "BR-08"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "BE": 7, "FE": 5, "QA": 3 },
|
|
"rationale": "Tích/đổi điểm theo sự kiện OrderDelivered, xếp hạng thành viên theo chi tiêu 12 tháng; công thức tính điểm còn là giả định cần BA xác nhận.",
|
|
"assumptions": ["Công thức tính điểm (trên Order cha hay từng OrderSeller) là giả định của SAD §6.8, chưa xác nhận — xem openQuestions."]
|
|
},
|
|
{
|
|
"id": "WBS-30",
|
|
"name": "Đa ngôn ngữ nội dung (product/notification i18n, 5 ngôn ngữ)",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-15", "§4.1.1", "§5 product_i18n"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "BE": 5, "FE": 4, "QA": 3 },
|
|
"rationale": "Mô hình dữ liệu đa ngôn ngữ cho nội dung sản phẩm/thông báo, fallback về vi-VN; không gồm chi phí dịch thuật thực tế.",
|
|
"assumptions": ["Không bao gồm chi phí dịch thuật nội dung thực tế (biên dịch viên) — chỉ effort kỹ thuật khung i18n."]
|
|
},
|
|
{
|
|
"id": "WBS-31",
|
|
"name": "Hiển thị đa tiền tệ tham khảo",
|
|
"group": "Khách hàng",
|
|
"sources": ["FR-16", "§4.1.1", "§4.1.2"],
|
|
"complexity": "S",
|
|
"risk": "low",
|
|
"effortMD": { "BE": 2, "FE": 2, "QA": 1 },
|
|
"rationale": "Endpoint cấu hình tỷ giá + hiển thị displayPrices[], không ảnh hưởng luồng giao dịch VND.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-32",
|
|
"name": "Đăng ký & KYC người bán",
|
|
"group": "Merchant",
|
|
"sources": ["FR-17", "§3 Seller Management", "§4.1.7", "SCR-16", "SCR-23"],
|
|
"complexity": "L",
|
|
"risk": "high",
|
|
"effortMD": { "PM": 2, "BA": 3, "SA": 2, "BE": 12, "FE": 8, "UIUX": 3, "QA": 5 },
|
|
"rationale": "Wizard đăng ký 4 bước, upload KYCDocument lên S3 mã hoá riêng, luồng duyệt thủ công của Admin (BR-13).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-33",
|
|
"name": "Quản lý sản phẩm & tồn kho (Seller)",
|
|
"group": "Merchant",
|
|
"sources": ["FR-18", "§4.1.4", "SCR-18"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "BE": 8, "FE": 7, "UIUX": 2, "QA": 4 },
|
|
"rationale": "CRUD Product/ProductVariant/tồn kho, trạng thái bị gỡ do vi phạm (liên kết FR-24).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-34",
|
|
"name": "Quản lý đơn hàng (Seller)",
|
|
"group": "Merchant",
|
|
"sources": ["FR-19", "§4.1.5", "SCR-19"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "BE": 6, "FE": 6, "QA": 3 },
|
|
"rationale": "Danh sách/chi tiết đơn con theo seller, kiểm soát ownership (sellerId khớp JWT) chống IDOR.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-35",
|
|
"name": "Dashboard doanh thu & payout (Seller)",
|
|
"group": "Merchant",
|
|
"sources": ["FR-20", "§4.1.7", "SCR-17", "SCR-20"],
|
|
"complexity": "M",
|
|
"risk": "low",
|
|
"effortMD": { "BA": 2, "BE": 5, "FE": 6, "UIUX": 2, "QA": 3 },
|
|
"rationale": "Dashboard tổng quan + báo cáo chi tiết doanh thu/hoa hồng/payout, chỉ lọc theo sellerId trong JWT.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-36",
|
|
"name": "Cấu hình hoa hồng theo ngành hàng",
|
|
"group": "Admin",
|
|
"sources": ["FR-21", "§4.1.8", "SCR-25", "BR-04"],
|
|
"complexity": "S",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 1, "BE": 4, "FE": 3, "QA": 2 },
|
|
"rationale": "CRUD CommissionRule kèm holdDays theo category, audit log thay đổi.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-37",
|
|
"name": "Payout định kỳ & Commission engine (tính hoa hồng, hold, batch)",
|
|
"group": "Admin",
|
|
"sources": ["FR-22", "§3 Commission & Payout", "§4.1.8", "§6.1.4", "SCR-27", "TC-25"],
|
|
"complexity": "XL",
|
|
"risk": "high",
|
|
"effortMD": { "PM": 2, "BA": 3, "SA": 2, "BE": 15, "FE": 6, "QA": 7 },
|
|
"rationale": "Luồng tài chính nhạy cảm nhất: tính hoa hồng, kỳ giữ tiền (hold 3-7 ngày), tạo đợt payout hàng tuần, audit trail độc lập.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-38",
|
|
"name": "Quản trị người bán (duyệt/khoá)",
|
|
"group": "Admin",
|
|
"sources": ["FR-23", "§4.1.7", "SCR-23"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 1, "BE": 5, "FE": 5, "QA": 3 },
|
|
"rationale": "Duyệt/từ chối/khoá/mở khoá tài khoản seller, ghi audit_log.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-39",
|
|
"name": "Quản trị catalog toàn sàn",
|
|
"group": "Admin",
|
|
"sources": ["FR-24", "§4.1.4", "SCR-24"],
|
|
"complexity": "M",
|
|
"risk": "low",
|
|
"effortMD": { "BA": 1, "BE": 5, "FE": 5, "QA": 3 },
|
|
"rationale": "Giám sát/ẩn/gỡ/khôi phục sản phẩm vi phạm toàn sàn, đồng bộ trạng thái sang Seller Portal.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-40",
|
|
"name": "Xử lý tranh chấp & khiếu nại (CSR + Admin escalation)",
|
|
"group": "Admin",
|
|
"sources": ["FR-25", "§3 Dispute/CSR handling", "§4.1.5", "SCR-28", "SCR-32", "BR-14"],
|
|
"complexity": "L",
|
|
"risk": "high",
|
|
"effortMD": { "PM": 1, "BA": 3, "SA": 1, "BE": 10, "FE": 8, "QA": 5 },
|
|
"rationale": "Hàng đợi CSR + escalation Admin, liên kết PayoutHold (reversed/holding), công thức hoàn tiền còn là giả định.",
|
|
"assumptions": ["Công thức/mức hoàn tiền dispute (toàn phần hay theo tỷ lệ) chưa chốt (BR-14, SAD §9.7) — có thể ảnh hưởng effort khi có quyết định nghiệp vụ."]
|
|
},
|
|
{
|
|
"id": "WBS-41",
|
|
"name": "Vận hành kho & vận chuyển (Shipping & Fulfillment — business logic)",
|
|
"group": "Admin",
|
|
"sources": ["FR-26", "§3 Shipping & Fulfillment", "§4.1.12", "SCR-30", "SCR-31", "BR-15"],
|
|
"complexity": "L",
|
|
"risk": "medium",
|
|
"effortMD": { "BA": 2, "SA": 1, "BE": 10, "FE": 6, "QA": 5 },
|
|
"rationale": "Điều phối đóng gói/tạo lô hàng, đồng bộ trạng thái vận chuyển; không gồm adapter GHN/GHTK cụ thể (xem WBS-13/14).",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-42",
|
|
"name": "Xác thực đa yếu tố (MFA) cho Admin/Seller",
|
|
"group": "Admin",
|
|
"sources": ["FR-27", "§4.1.3", "§8.1.1a", "SCR-21", "SCR-29"],
|
|
"complexity": "M",
|
|
"risk": "medium",
|
|
"effortMD": { "BE": 5, "FE": 3, "QA": 3 },
|
|
"rationale": "MFA bắt buộc cho Admin (chặn hoàn toàn scope admin:* nếu chưa enroll), khuyến khích cho Seller; dùng chung hạ tầng TOTP xây ở WBS-05.",
|
|
"assumptions": []
|
|
},
|
|
{
|
|
"id": "WBS-43",
|
|
"name": "Admin Dashboard tổng quan vận hành",
|
|
"group": "Admin",
|
|
"sources": ["SCR-22"],
|
|
"complexity": "M",
|
|
"risk": "low",
|
|
"effortMD": { "BA": 1, "BE": 4, "FE": 5, "UIUX": 2, "QA": 2 },
|
|
"rationale": "Dashboard tổng hợp GMV/đơn hàng/seller chờ duyệt/tranh chấp mở; không truy vết trực tiếp 1 FR cụ thể theo ghi chú SAD §7.3.",
|
|
"assumptions": ["Màn hình không gắn trực tiếp với 1 FR cụ thể (SAD §7.3 ghi nhận cần BA xác nhận phạm vi chính thức) — effort giả định theo dashboard tổng hợp tiêu chuẩn."]
|
|
}
|
|
],
|
|
"ucp": {
|
|
"actors": { "simple": 7, "average": 0, "complex": 6 },
|
|
"useCases": { "simple": 4, "average": 13, "complex": 4 },
|
|
"tcf": [
|
|
{ "id": "T1", "name": "Hệ thống phân tán", "score": 5, "why": "Kiến trúc ~11 service độc lập database-per-service giao tiếp qua REST + event broker (§3.1/§3.2)." },
|
|
{ "id": "T2", "name": "Yêu cầu hiệu năng/thời gian phản hồi", "score": 5, "why": "NFR-01 yêu cầu catalog/search <2s, checkout <3s kể cả tải đỉnh flash sale." },
|
|
{ "id": "T3", "name": "Hiệu quả cho người dùng cuối", "score": 4, "why": "5 nhóm người dùng (Guest/Customer/Seller/Admin/Ops/CSR), mỗi nhóm có UI tối ưu riêng theo §7." },
|
|
{ "id": "T4", "name": "Xử lý nội bộ phức tạp", "score": 5, "why": "Saga checkout tách đơn theo seller, tính hoa hồng/kỳ giữ tiền payout, loyalty tiered theo chi tiêu 12 tháng (BR-01..BR-08)." },
|
|
{ "id": "T5", "name": "Khả năng tái sử dụng", "score": 3, "why": "Có design system dùng chung (§7.0) nhưng logic nghiệp vụ mỗi service khá đặc thù." },
|
|
{ "id": "T6", "name": "Dễ cài đặt", "score": 2, "why": "Triển khai container hoá theo IaC trên AWS, quy trình cài đặt khá chuẩn hoá (§3.3)." },
|
|
{ "id": "T7", "name": "Dễ sử dụng", "score": 3, "why": "Thiết kế UI có trạng thái loading/empty/error rõ ràng theo §7.0 nhưng nhiều luồng nghiệp vụ phức tạp (checkout đa seller, KYC)." },
|
|
{ "id": "T8", "name": "Khả năng chuyển đổi nền tảng (portability)", "score": 2, "why": "Gắn khá chặt với dịch vụ AWS cụ thể (RDS, MSK, OpenSearch, S3, CloudFront) theo §3.2." },
|
|
{ "id": "T9", "name": "Dễ thay đổi", "score": 3, "why": "Ranh giới service theo domain hỗ trợ phát triển độc lập (NFR-07) nhưng có ràng buộc event schema giữa các service." },
|
|
{ "id": "T10", "name": "Xử lý đồng thời (concurrency)", "score": 5, "why": "NFR-02 yêu cầu scale-out, hỗ trợ hàng chục nghìn concurrent user mùa flash sale." },
|
|
{ "id": "T11", "name": "Tính năng bảo mật", "score": 5, "why": "PII/KYC, MFA bắt buộc Admin, mã hoá KMS, PCI-DSS scope giảm, chống IDOR toàn API (§8, §4.1.1)." },
|
|
{ "id": "T12", "name": "Truy cập trực tiếp cho bên thứ ba", "score": 3, "why": "7 tích hợp bên ngoài (VNPay/Momo/GHN/GHTK/OAuth/Email-SMS/Ngân hàng) nhưng không có Public/Partner API (§3.4, §4)." },
|
|
{ "id": "T13", "name": "Yêu cầu đào tạo đặc biệt", "score": 3, "why": "5 nhóm người dùng với 32 màn hình khác nhau (Customer/Seller/Admin/Ops/CSR portal) cần đào tạo riêng theo vai trò." }
|
|
],
|
|
"ef": [
|
|
{ "id": "E1", "name": "Quen thuộc với mô hình dự án (UCP/RUP)", "score": 3, "why": "Giả định đội có kinh nghiệm trung bình với phương pháp ước lượng UCP, chưa xác nhận cụ thể." },
|
|
{ "id": "E2", "name": "Kinh nghiệm ứng dụng (domain e-commerce/marketplace)", "score": 4, "why": "Giả định đội có kinh nghiệm triển khai hệ thống thương mại điện tử tương tự quy mô lớn." },
|
|
{ "id": "E3", "name": "Kinh nghiệm hướng đối tượng/microservices", "score": 4, "why": "Kiến trúc yêu cầu kinh nghiệm thiết kế service theo domain, event-driven, database-per-service." },
|
|
{ "id": "E4", "name": "Năng lực chuyên viên phân tích chủ trì", "score": 4, "why": "Giả định có SA/BA chủ trì đủ năng lực điều phối 11 service và nhiều tích hợp bên thứ ba." },
|
|
{ "id": "E5", "name": "Động lực đội dự án", "score": 4, "why": "Giả định đội ngũ ổn định, động lực cao cho dự án dài hạn 9-12 tháng." },
|
|
{ "id": "E6", "name": "Yêu cầu ổn định", "score": 3, "why": "Còn nhiều điểm giả định/chưa chốt (SLA, ngân hàng payout, công thức loyalty/dispute) — xem openQuestions của SAD." },
|
|
{ "id": "E7", "name": "Nhân sự bán thời gian (part-time)", "score": 3, "why": "Giả định một số vai trò hỗ trợ (BA/PM/UIUX) làm việc bán thời gian/kiêm nhiệm nhiều hạng mục." },
|
|
{ "id": "E8", "name": "Ngôn ngữ lập trình khó", "score": 2, "why": "Không có ràng buộc ngôn ngữ đặc biệt, giả định dùng stack phổ biến (Node.js/Java/Go) theo §9.6." }
|
|
],
|
|
"notes": "Actors: 6 actor người dùng qua GUI (Guest/Customer/Seller/PlatformAdmin/OpsStaff/CSR) tính là complex; 7 hệ thống bên ngoài (VNPay, Momo, GHN, GHTK, Google/Facebook OAuth, Email/SMS Provider, Ngân hàng) tương tác qua API tính là simple, theo §3.4. Use case đếm từ sơ đồ use case tổng quan SAD §2.3 (UC1-UC21), phân loại theo số bước giao dịch ước lượng từ đặc tả API/luồng nghiệp vụ liên quan (§4, §6)."
|
|
},
|
|
"nonLabor": [
|
|
{
|
|
"id": "NL-01",
|
|
"name": "Hạ tầng cloud AWS năm đầu (Dev + Staging + Production)",
|
|
"basis": "Sizing 3 môi trường theo §3.3 (ECS Fargate/EKS auto-scaling, RDS Multi-AZ + read replica, ElastiCache Redis, OpenSearch cluster đa node, CloudFront, WAF)",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "yearly",
|
|
"note": "[[CẦN ĐIỀN]] — bid-config.nonLabor rỗng, chưa có báo giá AWS cụ thể theo sizing thực tế"
|
|
},
|
|
{
|
|
"id": "NL-02",
|
|
"name": "OpenSearch cluster (Search subsystem)",
|
|
"basis": "§3.2 Search subsystem đa node cho Production",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "yearly",
|
|
"note": "[[CẦN ĐIỀN]]"
|
|
},
|
|
{
|
|
"id": "NL-03",
|
|
"name": "Phí giao dịch cổng thanh toán VNPay/Momo",
|
|
"basis": "§3.4 — phí theo % giao dịch hoặc phí cố định theo hợp đồng với VNPay/Momo",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "monthly",
|
|
"note": "[[CẦN ĐIỀN]] — phụ thuộc hợp đồng thương mại giữa chủ dự án và VNPay/Momo, ngoài phạm vi nhà thầu"
|
|
},
|
|
{
|
|
"id": "NL-04",
|
|
"name": "Phí gửi Email/SMS thông báo",
|
|
"basis": "§3.4 Notification Service — phí theo số lượng email/SMS gửi (SES/SNS hoặc nhà cung cấp nội địa)",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "monthly",
|
|
"note": "[[CẦN ĐIỀN]] — nhà cung cấp cụ thể chưa chốt theo SAD §3.4"
|
|
},
|
|
{
|
|
"id": "NL-05",
|
|
"name": "Phí tích hợp API GHN/GHTK",
|
|
"basis": "§3.4 — phí kết nối/API (nếu có) theo hợp đồng đơn vị vận chuyển",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "monthly",
|
|
"note": "[[CẦN ĐIỀN]]"
|
|
},
|
|
{
|
|
"id": "NL-06",
|
|
"name": "Domain, SSL certificate, WAF rule bổ sung",
|
|
"basis": "§3.2 (WAF), §3.3",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "yearly",
|
|
"note": "[[CẦN ĐIỀN]]"
|
|
},
|
|
{
|
|
"id": "NL-07",
|
|
"name": "Pentest ứng dụng hàng năm + ASV scan hàng quý",
|
|
"basis": "§9.1.5 DAST/Penetration test cho phạm vi PCI-DSS SAQ A",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "yearly",
|
|
"note": "[[CẦN ĐIỀN]] — thường thuê dịch vụ bên thứ ba"
|
|
},
|
|
{
|
|
"id": "NL-08",
|
|
"name": "Chi phí đào tạo & tài liệu bàn giao (in ấn, workshop trực tiếp nếu có)",
|
|
"basis": "B9 dossier-structure — kế hoạch đào tạo/chuyển giao",
|
|
"amount": null,
|
|
"currency": "VND",
|
|
"recurring": "one-off",
|
|
"note": "[[CẦN ĐIỀN]]"
|
|
}
|
|
],
|
|
"assumptions": [
|
|
"Ước lượng dựa trên toàn bộ 27 FR + 8 NFR đã chốt trong docs/SAD.md, chưa có HSMT/RFP cụ thể để đối chiếu (xem bid/01-compliance-matrix.md).",
|
|
"Năng suất giả định theo đội ngũ có kinh nghiệm trung bình-cao với kiến trúc microservices/event-driven, chưa tính rủi ro do đội mới hình thành hoặc luân chuyển nhân sự.",
|
|
"QA effort ước lượng khoảng 25-40% effort BE/FE theo từng hạng mục.",
|
|
"PM/BA effort phân bổ theo từng hạng mục (overheadMode=itemized theo bid-config), có thêm 1 dòng PM riêng (WBS-08) cho quản lý dự án tổng thể xuyên suốt.",
|
|
"Không tính chi phí dịch thuật nội dung 5 ngôn ngữ (chỉ tính effort kỹ thuật xây khung i18n).",
|
|
"Không có yêu cầu di trú dữ liệu từ hệ thống cũ (dự án greenfield theo SAD §1.5)."
|
|
],
|
|
"exclusions": [
|
|
"Không bao gồm phí license/giao dịch bên thứ ba (cổng thanh toán, SMS/Email, ngân hàng) — xem nonLabor, cần chủ dự án/nhà thầu xác nhận số liệu thực tế.",
|
|
"Không bao gồm phát triển ứng dụng mobile app native (ngoài phạm vi MVP theo SAD §1.1/§7.0, dự kiến giai đoạn 2).",
|
|
"Không bao gồm affiliate marketing, subscription/bán hàng định kỳ, hoá đơn điện tử tự động cho seller, SSO doanh nghiệp (ngoài phạm vi MVP theo SAD §2.2/B2.2).",
|
|
"Không bao gồm chi phí dịch thuật nội dung đa ngôn ngữ (chỉ effort kỹ thuật khung i18n)."
|
|
],
|
|
"openQuestions": [
|
|
"Ngân sách và thời hạn dự án chưa được chủ dự án/bên mời thầu xác định chính thức (SAD giả định #7, §1.4) — ảnh hưởng trực tiếp đến khả năng chốt lịch trình và quy mô đội ngũ.",
|
|
"SLA hiệu năng/uptime (NFR-01 <2s/<3s, NFR-03 uptime 99.9%) là giả định mặc định chưa có xác nhận hợp đồng thực tế — có thể cần điều chỉnh lại effort test hiệu năng (WBS-06) sau khi chốt.",
|
|
"Ngân hàng đối tác và chuẩn kết nối payout (batch file NAPAS hay API) chưa chốt (SAD §9.7) — ảnh hưởng effort WBS-17 và chi phí phi nhân công liên quan.",
|
|
"Nhà cung cấp Email/SMS cụ thể chưa chốt (SES/SNS hay bên thứ ba nội địa) — ảnh hưởng effort WBS-15 và NL-04.",
|
|
"Công thức tính điểm loyalty (trên Order cha hay từng OrderSeller, có gồm phí vận chuyển/thuế hay không) và ngưỡng chi tiêu VND cho từng hạng thành viên chưa chốt (FR-14, SAD §9.7) — có thể ảnh hưởng effort WBS-29.",
|
|
"Công thức/mức hoàn tiền dispute (toàn phần hay theo tỷ lệ), ai chịu phí vận chuyển hoàn trả chưa chốt (FR-25/BR-14, SAD §9.7) — có thể ảnh hưởng effort WBS-40.",
|
|
"Màn hình Admin Dashboard tổng quan (SCR-22/WBS-43) không truy vết trực tiếp 1 FR cụ thể — cần BA/Product Owner xác nhận phạm vi chính thức trước khi triển khai chi tiết.",
|
|
"bid-config.md có rateCard theo vai trò nhưng nonLabor rỗng và nhiều trường bidder/client/package/ngày còn [[CẦN ĐIỀN]] — cần điền đầy đủ trước khi hồ sơ tài chính (Phần C) có thể hoàn chỉnh."
|
|
]
|
|
}
|