From 19f14d7905f22f1fed23125fdddcda92642949ef Mon Sep 17 00:00:00 2001 From: Ta Van Tuyen Date: Thu, 3 Sep 2026 22:38:24 +0700 Subject: [PATCH] =?UTF-8?q?t=C3=A0i=20li=E1=BB=87u=20=C4=91i=E1=BB=81u=20t?= =?UTF-8?q?ra=20v=C3=A0=20estimate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01-nghien-cuu-cong-nghe.md | 423 +++++++ 02-giai-phap-va-estimate.md | 540 ++++++++ 03-review.md | 130 ++ 04-review-doc-lap.md | 290 +++++ 05-kien-truc-va-codebase.md | 1095 +++++++++++++++++ 06-luu-y-gui-khach-hang.md | 142 +++ ...e_CallCenter_AmazonConnect_2026-09-03.xlsx | Bin 0 -> 34960 bytes README.md | 46 + .../japan-telecoms-coverage-2026-08-31.png | Bin 0 -> 252595 bytes 9 files changed, 2666 insertions(+) create mode 100644 01-nghien-cuu-cong-nghe.md create mode 100644 02-giai-phap-va-estimate.md create mode 100644 03-review.md create mode 100644 04-review-doc-lap.md create mode 100644 05-kien-truc-va-codebase.md create mode 100644 06-luu-y-gui-khach-hang.md create mode 100644 Estimate_CallCenter_AmazonConnect_2026-09-03.xlsx create mode 100644 README.md create mode 100644 evidence/japan-telecoms-coverage-2026-08-31.png diff --git a/01-nghien-cuu-cong-nghe.md b/01-nghien-cuu-cong-nghe.md new file mode 100644 index 0000000..1ed0554 --- /dev/null +++ b/01-nghien-cuu-cong-nghe.md @@ -0,0 +1,423 @@ +# Nghiên cứu công nghệ Amazon Connect cho D2C Call Center + +Ngày kiểm tra tài liệu: 03/09/2026 — **bản sửa lần 2 sau review độc lập** (xem `04-review-doc-lap.md`) +Đối tượng đọc: PM, solution architect, developer và người cần làm proposal cho khách Nhật. + +> **Đính chính quan trọng so với bản 1.** Bản 1 kết luận số 0120/0800 có thể dùng làm caller ID cho outbound campaign. Kiểm chứng lại trực tiếp trong Amazon Connect Telecoms Coverage Guide bản 31/08/2026 cho thấy **toll-free Nhật không nằm trong outbound campaign regions**, và **custom caller ID không khả dụng tại Nhật**. Mục §4 đã được viết lại hoàn toàn. + +> Ghi chú tên sản phẩm: tài liệu AWS hiện dùng tên **Amazon Connect Customer**. Trong tài liệu này, “Amazon Connect” và “Connect Customer” cùng chỉ nền tảng contact center của AWS. + +## 1. Bài toán cần giải quyết + +Khách hàng muốn mở call center D2C khoảng 10–15 chỗ ngồi, chủ yếu gọi sales outbound theo danh sách, có thể bổ sung inbound. Tất cả agent cần gọi đồng thời bằng cùng một số toll-free — **yêu cầu này không thực hiện được nguyên văn, xem §4**; mọi cuộc nói chuyện phải được ghi âm, chuyển thành text, lưu trên AWS và dùng để phân tích sentiment/giọng nói. + +Đây không chỉ là bài toán “đặt cuộc gọi”. Một hệ thống vận hành được cần quản lý đồng thời: + +- dữ liệu khách và quyền được liên hệ; +- chiến dịch, lịch gọi, số lần thử lại và suppression/do-not-call; +- trạng thái agent, phân phối cuộc gọi và after-call work; +- kết quả nghiệp vụ của cuộc gọi; +- ghi âm, transcript, phân tích, tìm kiếm và báo cáo; +- quyền truy cập dữ liệu nhạy cảm, retention, audit và giám sát hệ thống. + +## 2. Các thành phần AWS phù hợp + +| Thành phần | Vai trò trong giải pháp | +|---|---| +| Amazon Connect Customer | Contact center, softphone trên trình duyệt, user/queue/routing, contact flow, inbound và outbound | +| Customer Profiles + Segments | Nạp CSV danh sách khách, chuẩn hóa profile và tạo segment dùng cho campaign | +| Outbound Campaigns | Preview/progressive/predictive dialing, AMD, retry, lịch và giới hạn tần suất liên hệ | +| Agent Workspace | Màn hình agent gồm call controls, customer profile, task/case/guide và app tích hợp | +| Conversational Analytics (Contact Lens) | Transcript, sentiment, loudness, silence, interruption, category, summary và tìm kiếm cuộc gọi | +| Amazon S3 + AWS KMS | Lưu recording và file phân tích, mã hóa và lifecycle | +| EventBridge/Lambda/DynamoDB | Lưu disposition nghiệp vụ, callback, DNC và xử lý sự kiện theo contact ID | +| Connect data lake/Lake Formation/Athena/QuickSight | Báo cáo nâng cao, phân tích liên chiến dịch và dữ liệu dài hạn | +| CloudWatch/CloudTrail | Metrics, alarm, log flow và audit API | + +### 2.1 Snapshot các thay đổi công nghệ đáng chú ý đến 03/09/2026 + +- Outbound Campaigns hiện có Guided Campaign Builder, CSV-based segment, preview/progressive/predictive, communication limits, retry và campaign scheduling ngay trong Connect; nhu cầu tự xây dialer cho MVP đã giảm đáng kể — **với điều kiện source number là DID**. Tại Nhật, toll-free không dùng được cho campaign, xem §4. +- Conversational Analytics hỗ trợ tiếng Nhật cho cả post-call và real-time, summary, information extraction, sentiment và automated evaluation. Real-time dashboard alert cho keyword/sentiment giúp supervisor can thiệp sớm. +- Persistent agent connection có thể giữ kênh giữa agent và Connect sau khi kết thúc cuộc gọi, giảm thời gian nối agent cho các cuộc outbound tiếp theo. Kết hợp auto-accept và ACW ngắn để giảm khoảng im lặng sau khi khách bắt máy. +- Connect analytics data lake cung cấp contact/campaign tables để query, nhưng cửa sổ truy cập native là rolling 25 tháng; dữ liệu cần giữ lâu hơn phải export. +- Global Resiliency hiện hỗ trợ cặp Tokyo–Osaka, nhưng cần gói AWS Enterprise Support hoặc Unified Operations và quy trình onboarding riêng. +- Amazon Connect Customer Voice ID đã kết thúc hỗ trợ ngày 20/05/2026. Không dùng Voice ID làm nền tảng cho “phân tích tone/emotion” hay xác thực giọng nói trong thiết kế mới. +- Pricing hiện có gói Connect Customer tích hợp AI theo phút và Customer Basic cho một số khách hàng cũ; phải xác nhận pricing plan của account trước khi dự toán OPEX. + +Nguồn: [Amazon Connect release notes](https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-release-notes.html), [Global Resiliency requirements](https://docs.aws.amazon.com/connect/latest/adminguide/connect-global-resiliency-requirements.html), [Service quotas and Voice ID end-of-support notice](https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-service-limits.html). + +## 3. Outbound theo danh sách + +### 3.1 Nạp danh sách + +Connect Customer cho phép tạo segment từ file CSV. Theo tài liệu hiện tại, file phải: + +- là CSV, UTF-8 **không có BOM**; +- có header; +- nhỏ hơn 1 GB; +- map các cột vào standard hoặc custom attributes của Customer Profiles. + +Khi import, profile được tạo/cập nhật rồi gom vào segment. Segment đó có thể được chọn trực tiếp trong Guided Campaign Builder. Đây là con đường ít code nhất để có chức năng tương tự phần “list import + campaign dial” của BlueBean. + +Nên quy định template tối thiểu: + +```text +external_customer_id,phone_number,full_name,timezone,consent_source,consent_at,do_not_call,campaign_group +``` + +Số điện thoại phải được chuẩn hóa E.164, ví dụ số Nhật bỏ số `0` đầu và thêm `+81`. + +Nguồn: [Create segments from imported files](https://docs.aws.amazon.com/connect/latest/adminguide/customer-segments-imported-files.html). + +### 3.2 Chế độ quay số + +| Chế độ | Cách hoạt động | Khi nên dùng | +|---|---|---| +| Preview | Agent xem thông tin trước rồi chấp nhận/gọi | Lead giá trị cao, cần đọc lịch sử trước khi gọi | +| Progressive | Chỉ gọi lead tiếp theo sau khi agent hoàn thành cuộc trước | MVP sales; cân bằng năng suất và rủi ro silent/abandoned call | +| Predictive | Thuật toán gọi trước dựa trên xác suất bắt máy và agent sắp rảnh | Volume lớn; cần kiểm soát abandonment và tuân thủ pháp lý | +| Agentless | Flow/voice bot xử lý, không nối agent | Reminder/thông báo tự động, không phải sales có người tư vấn | + +Khuyến nghị MVP dùng **progressive** làm mặc định và preview cho nhóm lead cần xem trước. Predictive nên để phase sau vì cần đủ volume để mô hình pacing có ý nghĩa, quota lớn hơn và kiểm soát abandoned call chặt hơn. + +Ở agent setting nên bật auto-accept và persistent connection, đồng thời đặt ACW vừa đủ để nhập disposition. AWS gợi ý ACW 30 giây để tối ưu predictive dialer, nhưng dự án phải đo thời gian nhập kết quả thực tế thay vì áp dụng máy móc. + +**Ràng buộc phải biết trước khi thiết kế:** + +- Source number của campaign **phải là DID**. Tại Nhật, toll-free 0120/0800 không nằm trong outbound campaign regions (§4). +- Block `Check call progress` (AMD) **chỉ hoạt động cho hai loại cuộc gọi**: cuộc gọi của outbound campaign, và customer-first callback. Mọi loại khác — kể cả cuộc gọi tạo bằng `StartOutboundVoiceContact` — đều rơi vào nhánh `Error`. Nghĩa là nếu tự xây dialer thì mất AMD native. + +Outbound Campaigns hỗ trợ: + +- source phone number thuộc Connect instance (DID); +- call progress/answering machine detection (AMD); +- retry theo disposition kỹ thuật như busy, unanswered, voicemail; +- active communication time, exception date, schedule và expiry; +- giới hạn số lần liên hệ theo campaign/toàn instance; +- campaign metrics và event data. + +Lưu ý: disposition của dialer như `HUMAN_ANSWERED`, `SIT_TONE_BUSY`, `AMD_UNANSWERED` không thay cho kết quả nghiệp vụ như “đã bán”, “gọi lại”, “không quan tâm”, “không gọi nữa”. Cần form after-call work để lưu kết quả nghiệp vụ. + +Nguồn: [Guided Campaign Builder](https://docs.aws.amazon.com/connect/latest/adminguide/guided-campaign-builder.html), [Outbound campaign best practices](https://docs.aws.amazon.com/connect/latest/adminguide/outbound-campaign-best-practices.html), [BlueBean feature page](https://www.bluebean365.jp/). + +## 4. Số điện thoại: cùng một số cho mọi agent + +### 4.1 Điều Amazon Connect thực sự hỗ trợ tại Nhật + +Trích **Amazon Connect Telecoms Coverage Guide**, bản in ngày 31/08/2026, khối Japan (ảnh chụp: `evidence/japan-telecoms-coverage-2026-08-31.png`): + +| Loại số | Number availability | National Outbound | International Outbound | Porting | Custom Caller ID | Region Availability | **Outbound Campaign Regions** | +|---|:--:|:--:|:--:|:--:|:--:|---|:--:| +| DID `+81 3` / `+81 6` | ✔ (footnote 2) | ✔ | ✔ | ✔ (hạn chế) | **✘** | ap-northeast-1 | **ap-northeast-1** | +| DID `+81 50` | ✔ | ✔ | ✔ | ✘ | **✘** | All commercial regions | **ap-northeast-1** | +| Toll-free `+81 120` / `+81 800` | ✔ | ✔ | ✘ | ✔ | **✘** | All commercial regions | **–** | +| UIFN | ✔ | ✘ | ✘ | ✔ | **✘** | All commercial regions | **–** | + +Footnote (2) của bảng: *"Local Numbers and Porting in Japan is only possible on specific numbers"*. + +Cách đọc bảng đã được đối chiếu chéo với các nước khác để loại trừ khả năng nhầm ô gộp: Hàn Quốc (DID → `ap-northeast-2`, Toll-free → `–`), Úc (DID → `ap-southeast-2`, Toll-free/UIFN → `–`), Ý và Áo (Toll-free có National Outbound ✔ nhưng campaign `–`). Mỹ là ngoại lệ duy nhất có cả DID lẫn Toll-free campaign-capable. **Nhật theo mẫu chung.** + +### 4.2 Ba kết luận bắt buộc + +**(1) Toll-free Nhật không dùng được cho Outbound Campaigns.** + +`National Outbound = ✔` với toll-free chỉ có nghĩa là **gọi ra thủ công** với caller ID 0120 được hỗ trợ và CLI được đảm bảo hiển thị. Nhưng cột `Outbound Campaign Regions` để trống. Toàn bộ phần "giống BlueBean" — Guided Campaign Builder, preview/progressive/predictive, AMD, retry theo disposition, communication limits, campaign schedule — đi kèm campaign, và do đó đi kèm DID. + +Hệ quả: hai yêu cầu gốc của khách, 「リストをもとに発信できるシステム」 và 「同じフリーダイヤルで全員が発信できる」, **không thể đồng thời thỏa mãn bằng tính năng native**. Đây là quyết định phải đưa cho khách chốt. + +**(2) Không có custom caller ID tại Nhật.** + +Cột Custom Caller ID = ✘ cho cả 4 loại số. Không tồn tại đường "giữ số ở carrier hiện tại, chứng minh quyền sở hữu rồi hiển thị khi gọi ra". Số nào muốn dùng thì phải claim mới hoặc **port hẳn vào Amazon Connect** — kéo theo việc nghiệp vụ đang chạy trên số đó bị ảnh hưởng. + +**(3) Lịch xin và chuyển số là ràng buộc cứng.** + +| Yếu tố | Quy định | Ảnh hưởng | +|---|---|---| +| Cửa sổ port số Nhật (toll-free và 03/06) | **Thường là ngày 1 và ngày 15 của tháng kế tiếp** | Trượt một nhịp là chậm nửa tháng | +| Hồ sơ claim số Nhật | Giấy đăng ký doanh nghiệp cấp trong 6 tháng; ID/hộ chiếu người đại diện có tên trong đăng ký; giấy tờ chứng minh địa chỉ cấp trong 6 tháng. Gộp thành một file ZIP | Phải yêu cầu khách chuẩn bị ngay tuần 1 | +| Địa chỉ cho số `+81 3` / `+81 6` | Phải thuộc **đúng thành phố của area code** | Văn phòng chưa đăng ký ở Tokyo thì không claim được số 03 | +| Hồ sơ cho toll-free | Nhẹ hơn: đăng ký doanh nghiệp + ID người đại diện; địa chỉ toàn cầu chấp nhận được | | +| Port | Cần hóa đơn gần nhất + Letter of Authorization theo mẫu AWS + bộ hồ sơ trên | Phải mở Support ticket để AWS kiểm tra số có port được không | + +### 4.3 Ba phương án thiết kế + +| | **Phương án A (khuyến nghị)** | Phương án B | Phương án B' (cần PoC) | +|---|---|---|---| +| Số phát ra | DID `+81 3` (hoặc `+81 50`) | Toll-free 0120 | Toll-free 0120 | +| Số nhận vào | 0120 | 0120 | 0120 | +| Cơ chế quay số | Outbound Campaigns native | Tự xây trên `StartOutboundVoiceContact` | Customer-first callback + `Check call progress` | +| AMD | Có | **Không** | Có, **nếu** PoC xác nhận | +| Retry / schedule / frequency cap | Native | Tự xây | Tự xây | +| Chênh effort so với A | – | +18–30 PD | +12–20 PD + 5–8 PD PoC | +| Rủi ro | Thấp | Cao | Cao, chưa có tài liệu AWS khẳng định | + +Khi chọn DID cho phương án A, cần cân nhắc: + +- `+81 3` / `+81 6` (số địa lý): tỷ lệ bắt máy tốt nhất, nhưng vướng điều kiện địa chỉ và footnote (2) về tồn kho số. +- `+81 50` (IP phone): claim dễ, mọi region, nhưng người tiêu dùng Nhật có xu hướng không bắt máy số 050 và các app chặn cuộc gọi gắn cờ mạnh với dải này — ảnh hưởng trực tiếp KPI của một call center bán hàng. + +### 4.4 Các điều kiện kỹ thuật khác vẫn đúng + +- Connect cho phép đặt outbound caller ID ở queue; mọi agent dùng chung một outbound queue/routing profile thì phát cùng một số. +- Số phải ở dạng E.164. +- Carrier và thiết bị đích quyết định cách hiển thị cuối cùng; không cam kết hiển thị tên doanh nghiệp. +- Toll-free là sản phẩm nội địa: `International Outbound = ✘`. Không gọi ra quốc tế được từ 0120. +- Khả năng phát caller ID và khả năng dùng số cho Outbound Campaigns là **hai kiểm tra khác nhau** — đây chính là chỗ bản 1 bị nhầm. + +Nguồn: [Telecoms Coverage Guide (PDF, 31/08/2026)](https://d1v2gagwb6hfe1.cloudfront.net/Amazon_Connect_Telecoms_Coverage.pdf), [Set up outbound caller ID](https://docs.aws.amazon.com/connect/latest/adminguide/queues-callerid.html), [Region requirements for ordering and porting phone numbers](https://docs.aws.amazon.com/connect/latest/adminguide/phone-number-requirements.html), [Outbound calling restrictions](https://docs.aws.amazon.com/connect/latest/adminguide/outbound-calling-restrictions.html), [Check call progress block](https://docs.aws.amazon.com/connect/latest/adminguide/check-call-progress.html). + +## 5. 15 cuộc gọi đồng thời và quota + +Khả năng scale của dịch vụ không phải vấn đề, nhưng quota mặc định là blocker: + +- `Concurrent active calls per instance`: mặc định **10**, có thể yêu cầu tăng; +- `Concurrent campaign active calls per instance`: mặc định **0**, có thể yêu cầu tăng. + +Active call bao gồm cuộc đang ở flow, đang chờ queue, đang nói với agent và outbound call. Vì vậy không được đặt quota đúng bằng 15 ghế. + +Khuyến nghị ban đầu: + +- MVP progressive/preview: xin ít nhất 25 concurrent active calls và 25 concurrent campaign active calls; +- nếu bật inbound đồng thời: tính peak inbound và tăng thêm headroom; +- khi dùng predictive: sizing lại theo dial rate, answer rate và abandonment target; thường cần campaign call quota lớn hơn số agent đáng kể, không chốt cứng trước load test. + +### 5.1 Các quota khác cần biết trước + +| Quota | Mặc định | Ảnh hưởng tới dự án này | +|---|---:|---| +| Concurrent active calls per instance | 10 | Blocker, phải xin lên 25 | +| Concurrent campaign active calls per instance | 0 | Blocker, phải xin lên 25 | +| Connect instances per Region | 2 | Vừa đủ non-prod + prod, không còn chỗ cho sandbox | +| Phone numbers per instance | 5 | Đủ cho MVP nhưng cần biết khi test nhiều số | +| Concurrent post-call analytics jobs | 200 | Dư sức cho 15 ghế | +| Concurrent real-time calls with analytics | 300 | Dư sức cho 15 ghế | + +### 5.2 Thời gian phê duyệt + +AWS yêu cầu **tạo instance trước** khi gửi yêu cầu tăng quota. Về thời gian, tài liệu AWS nói rõ: yêu cầu nhỏ có thể duyệt trong vài giờ, nhưng **yêu cầu lớn có thể mất tới 3 tuần**, và yêu cầu rất lớn ở quy mô toàn cầu có thể mất hàng tháng. Thời gian AWS/telco phê duyệt không nằm trong person-day phát triển, nhưng **phải nằm trong lịch dự án** — đây là điểm bản 1 chưa thể hiện đủ. + +Ngoài ra, để sizing công suất phân tích, AWS đưa công thức: `(phút/cuộc) × 0.4 × (cuộc/giờ) / 60` = số post-call analytics job đồng thời, với giả định thời gian phân tích bằng khoảng 40% độ dài cuộc gọi. Con số này cũng là căn cứ để đặt SLA kiểm tra artifact sau cuộc gọi. + +Nguồn: [Amazon Connect service quotas](https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-service-limits.html), [Plan ahead with quotas](https://docs.aws.amazon.com/connect/latest/adminguide/plan-ahead-quotas.html), [Availability by Region](https://docs.aws.amazon.com/connect/latest/adminguide/regions.html). + +## 6. Ghi âm và lưu S3 + +Call recording được bật ở instance nhưng còn phải bật trong contact flow bằng block **Set recording and analytics behavior**. Khi cuộc gọi kết thúc, recording được đưa vào S3 đã cấu hình và có thể mở từ contact detail. + +Thiết kế khuyến nghị: + +- ghi cả agent và customer từ thời điểm cuộc gọi được kết nối; +- S3 Block Public Access; +- SSE-KMS bằng customer-managed key cho production; +- security profile tách quyền xem contact, nghe recording và tải unredacted recording; +- S3 Lifecycle: Standard → Standard-IA/Glacier → expire theo chính sách; +- bật CloudTrail data events cho bucket recording nếu yêu cầu audit ai đọc/tải file; +- alarm khi recording/analytics job lỗi và có quy trình reprocess. + +Diễn giải đúng câu “ghi âm mọi cuộc gọi”: chỉ cuộc gọi đã kết nối và có media mới sinh recording. Busy, invalid number hoặc không bắt máy không có hội thoại để ghi; chúng vẫn có contact/campaign event và disposition kỹ thuật. + +Connect không hỗ trợ S3 Object Lock ở compliance mode trực tiếp trên bucket recording mặc định. Nếu cần WORM, phải thiết kế bản sao sang bucket archive phù hợp và kiểm tra lại luồng được AWS hỗ trợ. + +Nguồn: [Create a Connect instance and data storage](https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-instances.html), [Review recorded conversations](https://docs.aws.amazon.com/connect/latest/adminguide/review-recorded-conversations.html), [Encryption at rest](https://docs.aws.amazon.com/connect/latest/adminguide/encryption-at-rest.html). + +## 7. Transcript và phân tích hội thoại tiếng Nhật + +Với locale `ja_JP`, bảng ngôn ngữ hiện tại đánh dấu hỗ trợ: + +- post-call analytics; +- real-time call analytics; +- post-contact summaries; +- information extraction; +- sentiment analysis; +- pattern match rules; +- automated performance evaluations. + +Transcript và file phân tích gắn theo contact ID; supervisor có thể tìm, đọc theo từng lượt thoại và nhảy từ text tới đúng timestamp của audio. Analytics còn có: + +- sentiment agent/customer và sentiment shift; +- loudness theo đoạn; +- talk time, non-talk time; +- interruption; +- category theo keyword/pattern/semantic rule; +- issue, outcome và action item; +- post-contact summary. + +Có thể thêm custom vocabulary để cải thiện product name, brand name, acronym và thuật ngữ chuyên ngành. Mỗi ngôn ngữ chỉ có một vocabulary ở trạng thái default được áp dụng cho analysis tại một thời điểm; vocabulary mới không sửa ngược các transcript cũ. Không đưa PII/confidential data vào vocabulary. + +Điểm giới hạn quan trọng: cột **Redaction** cho `ja_JP` hiện để trống. Không được giả định Connect có thể tự che mọi PII tiếng Nhật trong transcript/audio. MVP nên hạn chế đọc thông tin thanh toán nhạy cảm qua điện thoại, dùng quyền truy cập và retention chặt; custom Japanese PII redaction là một workstream riêng nếu bắt buộc. + +Nguồn: [Supported languages](https://docs.aws.amazon.com/connect/latest/adminguide/supported-languages.html), [Set recording and analytics behavior](https://docs.aws.amazon.com/connect/latest/adminguide/set-recording-behavior.html), [Example analytics output](https://docs.aws.amazon.com/connect/latest/adminguide/contact-lens-example-output-files.html), [Custom vocabularies for conversational analytics](https://docs.aws.amazon.com/connect/latest/adminguide/add-custom-vocabulary.html). + +## 8. “Tone” và “emotion” thực sự đo được gì? + +### 8.1 Native và đủ dùng cho MVP + +Connect cung cấp: + +- **sentiment** positive/neutral/negative theo lượt thoại và toàn cuộc gọi; +- **loudness** để tìm đoạn nói lớn; +- interruption, silence/non-talk, talk ratio và talk speed; +- rule kết hợp, ví dụ sentiment âm + loudness cao + nhiều lần ngắt lời để gắn cờ cuộc gọi cần QA. + +AWS định nghĩa sentiment là phân tích nội dung text và tính score theo tần suất/streak của các lượt thoại. AWS cũng khuyến nghị xem loudness cùng sentiment. Vì vậy cụm “voice tone/emotion analysis” nên được nghiệm thu bằng các signal trên, không bằng lời hứa đọc chính xác cảm xúc nội tâm. + +Nguồn: [How sentiment scores are determined](https://docs.aws.amazon.com/connect/latest/adminguide/sentiment-scores.html), [Investigate loudness](https://docs.aws.amazon.com/connect/latest/adminguide/contact-lens-loudness.html), [Conversational analytics rules](https://docs.aws.amazon.com/connect/latest/adminguide/build-rules-for-contact-lens.html). + +### 8.2 Khi nào cần mô hình custom? + +Chỉ làm custom acoustic emotion model nếu khách yêu cầu nhãn cụ thể như angry/excited/sad theo **tín hiệu âm thanh**, có KPI precision/recall và dùng kết quả để ra quyết định. Cần: + +1. thống nhất taxonomy cảm xúc và mục đích sử dụng; +2. thu thập/label audio tiếng Nhật có sự đồng ý và đại diện đủ vùng giọng; +3. tách kênh agent/customer, trích acoustic features hoặc dùng audio model; +4. huấn luyện/evaluate trên hold-out set; +5. human review, drift/bias monitoring và cơ chế không tự động phạt agent; +6. pipeline batch sau cuộc gọi; real-time chỉ làm khi có business case rõ. + +Đây là R&D/ML, không phải cấu hình Connect. PoC không đồng nghĩa production-ready. + +## 9. Báo cáo và data lake + +Native dashboard đủ cho MVP: trạng thái agent, concurrent calls, contact search, recording/transcript, sentiment, campaign progress, dials/minute, connected/attempted và wait time sau khi khách bắt máy. + +Khi cần dashboard nghiệp vụ, dùng: + +```text +Connect data lake / contact & campaign events + + business outcome từ DynamoDB + ↓ + Lake Formation / Athena + ↓ + QuickSight +``` + +Connect analytics data lake cho truy cập rolling **25 tháng**. Nếu phải giữ lâu hơn, schedule export sang S3 thuộc quyền quản lý của doanh nghiệp rồi áp lifecycle. + +Nguồn: [Outbound campaign data in the data lake](https://docs.aws.amazon.com/connect/latest/adminguide/data-lake-outbound-campaigns-data.html), [Data lake retention](https://docs.aws.amazon.com/connect/latest/adminguide/data-lake-data-retention.html), [Reference queries](https://docs.aws.amazon.com/connect/latest/adminguide/data-lake-reference-queries.html). + +## 10. Agent workstation và mạng + +Agent dùng softphone WebRTC trên browser. AWS hỗ trợ ba phiên bản mới nhất của Chrome, Edge Chromium và Firefox/Firefox ESR; Safari không được hỗ trợ cho Agent Workspace/CCP. + +Tối thiểu theo AWS cho CCP-only: + +- 54 Kbps up/down cho một audio call, chưa tính CRM và ứng dụng khác; +- CPU 2 GHz, RAM 2 GB cho riêng CCP; +- USB headset được khuyến nghị; +- ưu tiên Ethernet có dây; +- latency endpoint test trung bình không vượt 300 ms; +- firewall/proxy phải cho phép các endpoint/port Connect yêu cầu, gồm TCP 443 và UDP 3478 theo hướng dẫn hiện hành. + +Thực tế nên cấp máy 8 GB RAM trở lên, browser được quản lý, USB headset có noise cancellation, dual Internet hoặc phương án 4G/5G failover cho site. Con số này là khuyến nghị vận hành, không phải minimum chính thức của AWS. + +Nguồn: [Agent headset and workstation requirements](https://docs.aws.amazon.com/connect/latest/adminguide/ccp-agent-hardware.html), [Supported browsers](https://docs.aws.amazon.com/connect/latest/adminguide/connect-supported-browsers.html), [Network troubleshooting](https://docs.aws.amazon.com/connect/latest/adminguide/network-ts.html). + +## 11. Bảo mật, riêng tư và quy định tại Nhật + +Đây không phải tư vấn pháp lý. Doanh nghiệp cần legal/compliance Nhật phê duyệt script, danh sách và retention. + +Các control hệ thống tối thiểu: + +- lưu consent source/time và lawful basis của từng lead; +- DNC/suppression toàn hệ thống, không chỉ giới hạn số lần gọi của một campaign; +- phát hiện duplicate và loại số invalid trước campaign; +- giới hạn khung giờ liên hệ và ngày nghỉ; +- script mở đầu nêu tên doanh nghiệp, người gọi, loại hàng/dịch vụ và mục đích chào bán; +- nếu khách từ chối, ghi DNC ngay và loại khỏi mọi lần tái liên hệ; +- công bố mục đích sử dụng recording/transcript; khuyến nghị phát thông báo ghi âm dù FAQ của PPC nói luật không luôn bắt buộc thông báo riêng việc đang ghi; +- role-based access, audit, retention và deletion workflow. + +Cơ quan Bảo vệ Thông tin Cá nhân Nhật cho biết nội dung cuộc gọi có thể là personal information nếu nhận dạng được cá nhân; khi đó doanh nghiệp phải thông báo hoặc công bố mục đích sử dụng. Consumer Affairs Agency nêu nghĩa vụ thông báo trước khi chào bán và cấm tiếp tục/tái chào bán với người đã thể hiện không muốn ký hợp đồng. + +### 11.1 Nếu chốt hợp đồng ngay trên điện thoại (電話勧誘販売) + +Đây là kịch bản rất dễ xảy ra với D2C bán qua điện thoại, và **bản 1 chưa đề cập**. Ngoài 氏名等の明示 và 再勧誘の禁止 đã nêu ở trên, còn phát sinh: + +- **書面交付義務**: phải giao văn bản hợp đồng cho khách theo quy định; +- **クーリング・オフ 8 ngày**: khách có quyền hủy trong 8 ngày kể từ khi nhận văn bản. + +Hệ quả lên hệ thống, cần chốt với legal của khách: + +- lưu mốc thời gian gửi và nhận văn bản của từng đơn; +- có trạng thái "đang trong thời hạn cooling-off" và cơ chế hủy đơn; +- không tiếp tục chào bán trong giai đoạn đó; +- gắn được bằng chứng này với `contactId` của cuộc gọi đã chốt đơn. + +Nếu khách xác nhận có bán chốt ngay trên điện thoại, đây là một workstream riêng chưa nằm trong estimate hiện tại. + +### 11.2 Hồ sơ khách Nhật thường yêu cầu + +- **セキュリティチェックシート** theo mẫu của khách; +- tài liệu **委託先管理** cho việc ủy thác xử lý dữ liệu cá nhân; +- quy trình xử lý yêu cầu **開示・訂正・利用停止・削除** của cá nhân — đặc biệt quan trọng vì hệ thống lưu cả giọng nói lẫn nội dung hội thoại. + +Nguồn chính thức: [PPC FAQ về nội dung và ghi âm cuộc gọi](https://www.ppc.go.jp/all_faq_index/faq1-q1-10/), [CAA Telemarketing Sales guide](https://www.no-trouble.caa.go.jp/what/telemarketing/), [CAA English guide](https://www.no-trouble.caa.go.jp/foreignlanguage/english/telemarketing/). + +## 12. Chi phí AWS: cách hiểu và công thức + +Trang giá ngày 03/09/2026 cho thấy mô hình Connect Customer mới và Customer Basic cũ có thể cùng tồn tại. Phải xác nhận account/contract của khách trước khi lập bill of materials. + +### Connect Customer hiện hành + +- voice thông thường: **USD 0.038/phút** cộng phí telephony; +- Outbound Campaigns voice: **USD 0.045/phút** thay cho mức voice USD 0.038/phút; +- số điện thoại tính theo ngày; telephony outbound tính theo destination; +- S3, KMS, CloudWatch, Athena/QuickSight và thuế/phụ phí tính riêng khi phát sinh. + +### Một số account còn ở Customer Basic + +- voice channel: USD 0.018/phút; +- conversational analytics: USD 0.015/phút cho 5 triệu phút đầu/tháng; +- outbound campaign: USD 0.005/attempt + USD 0.025/phút; +- cộng telephony, number rental và dịch vụ hạ tầng khác. + +Công thức sơ bộ cho mô hình mới: + +```text +Monthly AWS ≈ 0.045 × campaign_billable_minutes + + Japan outbound telephony + + phí thuê số theo ngày (DID gọi ra + toll-free nhận vào) + + S3/KMS/logging/reporting +``` + +### Ba kịch bản minh họa + +Không thể tính chính xác nếu chưa có số liệu thật, nhưng **phải đưa một hình dung về độ lớn** vì đây luôn là câu hỏi thứ hai của khách sau chi phí xây dựng. Bảng dưới đây tính theo mô hình Connect Customer hiện hành, chỉ tính phút **kết nối thật**: + +| | Thấp | Trung bình | Cao | +|---|---:|---:|---:| +| Agent hoạt động | 10 | 15 | 15 | +| Cuộc gọi ra / agent / ngày | 80 | 120 | 180 | +| Cuộc gọi ra / ngày | 800 | 1.800 | 2.700 | +| Tỷ lệ bắt máy | 10% | 15% | 20% | +| Cuộc kết nối / ngày | 80 | 270 | 540 | +| Thời lượng trung bình (phút) | 3 | 3 | 3,5 | +| Phút kết nối / tháng (20 ngày) | 4.800 | 16.200 | 37.800 | +| Connect campaign voice @ 0,045 USD/phút | 216 | 729 | 1.701 | +| Cước viễn thông Nhật @ 0,02–0,06 USD/phút | 96–288 | 324–972 | 756–2.268 | +| Số điện thoại, S3, KMS, log, báo cáo | 30–80 | 50–120 | 80–200 | +| **Tổng ước tính / tháng (USD)** | **340–580** | **1.100–1.820** | **2.540–4.170** | +| Tạm quy đổi 150 JPY/USD | ~5–9 万円 | ~17–27 万円 | ~38–63 万円 | + +Cách dùng bảng này: + +- **Mọi con số đều là giả định và hiện rõ trên mặt bảng** để khách sửa trực tiếp. Giá trị của bảng là buộc khách cung cấp số liệu thật, không phải là cam kết chi phí. +- Dải cước viễn thông 0,02–0,06 USD/phút là **giá trị giữ chỗ**, phải thay bằng số thật lấy từ bảng Global Telephony tại ngày báo giá, và tách riêng số cố định với số di động. +- Nếu account của khách còn ở gói **Customer Basic** cũ thì công thức khác hẳn: voice 0,018 + analytics 0,015 + campaign 0,005/attempt + 0,025/phút. Phải xác nhận pricing plan trước khi lập bảng chính thức. +- Chưa tính: cuộc gọi inbound, thuế và phụ phí, QuickSight, chi phí truyền dữ liệu, và dự phòng cho việc gọi lại nhiều lần. +- Nếu ngân sách là ràng buộc, đòn bẩy lớn nhất là **có bật phân tích hội thoại cho 100% cuộc gọi hay chỉ lấy mẫu** — cần hỏi khách sớm. + +Không thể tính số tiền tháng đáng tin cậy nếu chưa có: số attempt/ngày, answer rate, average connected duration, ngày làm/tháng, tỷ lệ retry, loại số đích mobile/landline, retention và pricing plan của account. + +Nguồn: [Connect Customer pricing](https://aws.amazon.com/products/connect/customer/pricing/), [Pricing appendix](https://aws.amazon.com/products/connect/customer/pricing/appendix/). Giá có thể thay đổi; phải kiểm tra lại khi gửi quotation. + +## 13. Kết luận nghiên cứu + +Amazon Connect phù hợp và có thể đáp ứng 10–15 seat mà không cần xây PBX/CTI riêng. Phương án native-first giảm code và thời gian, nhưng sáu điểm không được bỏ qua: + +1. **Toll-free Nhật không dùng được cho Outbound Campaigns.** Phải để khách chọn giữa "hiển thị フリーダイヤル khi gọi ra" và "tự động quay số theo danh sách" — không có cả hai bằng tính năng native. Khuyến nghị Phương án A: gọi ra bằng DID dùng chung, giữ 0120 để nhận cuộc gọi. +2. **Lịch số điện thoại là ràng buộc cứng**: hồ sơ pháp nhân, cửa sổ port ngày 1 và 15 của tháng kế tiếp, quota có thể mất tới 3 tuần. Phải khởi động ngay tuần 1 và không cam kết ngày go-live trước khi có xác nhận của AWS. +3. Bổ sung business disposition + DNC vì dialer disposition không đủ. +4. Định nghĩa đúng "emotion analysis" và acceptance criteria — dùng sentiment/loudness/interruption, không hứa đọc cảm xúc từ chất giọng. +5. Có quyết định rõ về PII tiếng Nhật, retention và legal compliance; riêng 電話勧誘販売 còn kéo theo 書面交付 và クーリング・オフ nếu chốt đơn qua điện thoại. +6. Nhận cuộc gọi vào không thể là tùy chọn: hiển thị một số chung để gọi ra thì chắc chắn có khách gọi lại. diff --git a/02-giai-phap-va-estimate.md b/02-giai-phap-va-estimate.md new file mode 100644 index 0000000..37b2563 --- /dev/null +++ b/02-giai-phap-va-estimate.md @@ -0,0 +1,540 @@ +# Giải pháp và estimate triển khai + +Ngày lập: 03/09/2026 — **bản sửa lần 2 sau review độc lập** (xem `04-review-doc-lap.md`) +Đơn vị estimate: **person-day (PD), 1 PD = 8 giờ làm việc hữu ích**. + +> **Thay đổi lớn nhất so với bản 1:** số フリーダイヤル 0120/0800 của Nhật **không dùng được** làm số phát cho tính năng quay số tự động theo danh sách của Amazon Connect. Toàn bộ tài liệu này đã được viết lại theo **Phương án A**: gọi ra bằng số cố định 03 (hoặc 050) dùng chung, giữ 0120 để nhận cuộc gọi. Phương án giữ 0120 để gọi ra được trình bày riêng ở §9. Chi tiết bằng chứng: `04-review-doc-lap.md` §1.1. + +--- + +## 1. Assumption dùng để estimate + +- Call center phục vụ khách tại Nhật; Connect instance đặt tại `ap-northeast-1` (Tokyo). +- 10–15 agent, tối đa 15 agent đang nói chuyện cùng lúc; 2 supervisor và 2 admin tối đa. +- Outbound D2C sales là chính. **Nhận cuộc gọi ở mức cơ bản nằm trong MVP**, vì khi hiển thị một số chung cho mọi cuộc gọi ra thì chắc chắn có khách gọi lại. +- **Số gọi ra là một số cố định 03/06 hoặc 050 dùng chung cho toàn bộ agent** (Phương án A). Số 0120 nếu khách đã có thì được đưa vào Connect để nhận cuộc gọi. +- Ngôn ngữ hội thoại, giao diện vận hành và toàn bộ tài liệu bàn giao là tiếng Nhật. +- Khách cung cấp: AWS account; bộ hồ sơ pháp nhân để xin/chuyển số (xem §5.1); domain/SSO nếu có; mẫu CSV danh sách; kịch bản sales đã được legal duyệt; danh sách số điện thoại dùng để test. +- MVP dùng màn hình agent và trình tạo chiến dịch có sẵn của Amazon Connect, không xây CRM đầy đủ và không xây portal riêng. +- MVP có form kết quả cuộc gọi tối giản, danh sách không gọi và hẹn gọi lại; không tích hợp hệ thống đơn hàng/thanh toán. +- Một môi trường non-production nhỏ và một production; dữ liệu test không dùng thông tin cá nhân thật. +- Làm việc 8x5; không bao gồm trực 24x7 hay dịch vụ vận hành sau giai đoạn hypercare. +- Estimate gồm BA/architecture/development/configuration/QA/PM/tài liệu/đào tạo; **không** gồm phí AWS, thiết bị, thuế, license ngoài AWS và **thời gian chờ AWS/nhà mạng/legal**. +- Range phản ánh độ chưa rõ hiện tại. Báo giá fixed-price nên dùng cận trên và dự phòng thương mại 10% sau discovery. + +--- + +## 2. Danh sách tính năng — mô tả theo ngôn ngữ người dùng + +Bảng dưới đây cố ý viết bằng ngôn ngữ nghiệp vụ. Cột "Hệ thống làm gì" là thứ có thể đọc trực tiếp cho khách hàng nghe; cột "Thành phần kỹ thuật" chỉ dành cho đội triển khai. + +**Cột "Cách làm" trả lời câu hỏi: cái này là bật sẵn hay phải viết mới?** + +| Ký hiệu | Nghĩa | Rủi ro và chi phí bảo trì | +|---|---|---| +| **⚙️ Cấu hình** | Dịch vụ AWS đã có sẵn tính năng này. Chỉ bật lên và khai báo tham số, không viết dòng code nào | Thấp nhất. AWS tự nâng cấp, không phải bảo trì | +| **⚙️+💻 Cấu hình + code nhỏ** | Phần lõi có sẵn, nhưng cần một đoạn code để nối hoặc để bù chỗ thiếu | Trung bình. Đoạn code đó phải tự bảo trì | +| **💻 Tự xây** | AWS không có sẵn. Phải thiết kế, viết, test và bảo trì | Cao nhất. Là nơi phát sinh lỗi và chi phí về sau | +| **📄 Thủ tục / tài liệu** | Không phải việc kỹ thuật: hồ sơ, quy trình, phê duyệt | Phụ thuộc bên thứ ba | + +### 2.1 Bắt buộc phải có để mở dịch vụ (MVP) + +| # | Tính năng | Hệ thống làm gì (đọc là hiểu) | Ai dùng | **Cách làm** | Thành phần kỹ thuật | +|---:|---|---|---|:--:|---| +| 1 | Tài khoản và phân quyền | Mỗi người một tài khoản riêng. Agent chỉ thấy phần việc của mình; chỉ quản lý mới nghe được ghi âm; chỉ admin mới sửa được cấu hình. Mọi thao tác nhạy cảm đều để lại dấu vết. | Tất cả | **⚙️** | Connect users, security profiles, CloudTrail | +| 2 | Nạp danh sách khách hàng | Quản lý tải file CSV lên. Hệ thống tự kiểm tra số điện thoại đúng định dạng, bỏ trùng, loại các số đã đăng ký "không gọi", rồi trả lại báo cáo dòng nào lỗi và lỗi vì sao. | Quản lý | **⚙️+💻** | Customer Profiles, segment từ file CSV | +| 3 | Tạo đợt gọi (chiến dịch) | Chọn danh sách, đặt khung giờ được phép gọi, số lần gọi lại khi máy bận/không bắt máy, giới hạn tối đa được liên hệ một người bao nhiêu lần, ngày nghỉ không gọi. Bấm chạy hoặc tạm dừng bất cứ lúc nào. | Quản lý | **⚙️** | Outbound Campaigns, Guided Campaign Builder | +| 4 | Tự động quay số | Hệ thống bấm số thay cho agent. Agent vừa xong cuộc này là có cuộc tiếp theo, không phải nhìn danh sách bấm tay. | Agent | **⚙️** | Progressive/preview dialing | +| 5 | Nhận biết máy trả lời tự động | Khi gọi ra, hệ thống phân biệt người thật bắt máy với hộp thư thoại hoặc thông báo của nhà mạng, và chỉ nối máy cho agent khi có người thật. | Agent | **⚙️** | Block `Check call progress` (AMD) | +| 6 | Mọi agent hiện cùng một số | Dù ai gọi thì khách cũng chỉ thấy một số duy nhất của công ty. Khách gọi lại vào số đó thì có người hoặc lời chào tiếp nhận. | Khách hàng cuối | **⚙️ + 📄** | Outbound caller ID ở queue dùng chung | +| 7 | Gọi được 15 cuộc cùng lúc | Cả 15 chỗ ngồi nói chuyện đồng thời mà không ai bị báo bận vì giới hạn hệ thống. | Tất cả | **⚙️ + 📄** | Tăng quota concurrent calls + campaign calls | +| 8 | Màn hình làm việc của agent | Khi khách bắt máy, thông tin khách hàng và kịch bản nói hiện lên sẵn. Có nút giữ máy, chuyển máy, kết thúc, và trạng thái rảnh/bận/đang nhập kết quả. | Agent | **⚙️** | Agent Workspace, screen pop, ACW | +| 9 | Ghi kết quả cuộc gọi | Kết thúc cuộc gọi, agent chọn kết quả: đã bán / quan tâm / hẹn gọi lại / không quan tâm / sai số / không gọi nữa — kèm ghi chú và giờ hẹn. | Agent | **💻** | Step-by-step guide → Lambda → DynamoDB | +| 10 | Danh sách không gọi | Khách nói "đừng gọi nữa" thì agent bấm một nút. Từ đó mọi đợt gọi sau đều tự động loại số này, không phụ thuộc vào việc ai tạo chiến dịch. | Agent, Quản lý | **💻** | Suppression store, điều kiện lọc khi tạo segment | +| 11 | Hẹn gọi lại | Agent đặt giờ hẹn; đến giờ, khách hàng đó xuất hiện lại trong việc cần làm, không bị quên và không bị tạo trùng. | Agent | **💻** | Callback records, trạng thái due/completed/cancelled | +| 12 | Ghi âm mọi cuộc nói chuyện | Mọi cuộc gọi có người bắt máy đều được ghi âm cả hai chiều, lưu trong AWS của chính công ty, có mã hóa. Chỉ người được cấp quyền mới nghe hoặc tải được. | Quản lý | **⚙️** | Recording block, S3 + KMS, lifecycle | +| 13 | Chuyển hội thoại thành văn bản | Sau cuộc gọi, nội dung được tự động ghi thành text tiếng Nhật, tách rõ lượt nói của agent và của khách. Bấm vào một câu là nhảy đến đúng đoạn ghi âm. | Quản lý | **⚙️** | Conversational Analytics `ja_JP` | +| 14 | Phân tích sắc thái cuộc gọi | Hệ thống chấm từng đoạn là tích cực / trung tính / tiêu cực, đo độ to giọng, khoảng im lặng và số lần nói chen. Dùng để lọc ra những cuộc cần nghe lại, không dùng để tự động đánh giá agent. | Quản lý | **⚙️** | Sentiment, loudness, interruption, rules | +| 15 | Nghe lén, nhắc riêng, chen ngang | Quản lý nghe cuộc gọi đang diễn ra để đào tạo; nhắc riêng cho agent mà khách không nghe thấy; hoặc nhảy vào cuộc gọi khi cần cứu tình huống. | Quản lý | **⚙️** | Manager listen-in / whisper / barge | +| 16 | Tìm lại cuộc gọi | Tìm theo ngày, agent, số điện thoại, kết quả, hoặc theo từ khóa xuất hiện trong nội dung hội thoại. | Quản lý | **⚙️** | Contact search | +| 17 | Bảng theo dõi thời gian thực | Xem ai đang gọi, ai đang rảnh, ai đang nhập kết quả; đợt gọi còn bao nhiêu số chưa gọi. | Quản lý | **⚙️** | Real-time metrics dashboard | +| 18 | Báo cáo | Số cuộc gọi ra, tỷ lệ bắt máy, thời lượng trung bình, kết quả theo agent và theo đợt gọi. Xuất được file. | Quản lý | **⚙️** | Historical/saved reports | +| 19 | Nhận cuộc gọi vào (mức cơ bản) | Khách gọi lại: trong giờ làm việc thì nối cho agent đang rảnh; ngoài giờ thì phát thông báo hoặc cho để lại lời nhắn. | Khách hàng cuối | **⚙️** | Inbound flow, hours of operation, queue | +| 20 | Cảnh báo và xử lý sự cố | Khi có trục trặc — thiếu file ghi âm, phân tích lỗi, chạm trần số cuộc đồng thời — hệ thống báo cho người phụ trách kèm hướng dẫn xử lý. | Admin | **⚙️+💻** | CloudWatch alarms, EventBridge, runbook | +| 21 | Đối soát dữ liệu | Mỗi ngày có một bảng đối chiếu: đã gọi bao nhiêu → bao nhiêu cuộc kết nối → bao nhiêu có ghi âm → bao nhiêu có text → bao nhiêu đã nhập kết quả. Lệch ở đâu nhìn ra ngay. | Quản lý, Admin | **💻** | Reconciliation report | +| 22 | Hồ sơ bảo mật và quyền riêng tư | Bộ tài liệu trả lời câu hỏi của khách về nơi lưu dữ liệu, ai truy cập được, giữ bao lâu, và quy trình khi cá nhân yêu cầu xem hoặc xóa dữ liệu của họ. | Quản lý, Legal | **📄** | セキュリティチェックシート, 委託先管理, retention policy | + +### 2.2 Nên có ở giai đoạn sau (Standard) + +| Tính năng | Hệ thống làm gì | **Cách làm** | Vì sao chưa làm ở MVP | +|---|---|:--:|---| +| Màn hình quản lý danh sách riêng | Một trang web riêng, tiếng Nhật, để trưởng nhóm tự nạp danh sách, xem tiến độ từng danh sách, chia danh sách cho từng agent, sửa nhanh số nhập sai — thay vì thao tác trên màn hình quản trị của AWS | **💻** | Cần MVP chạy thật để biết thao tác nào là thường xuyên nhất | +| Quản lý kết quả và hẹn gọi lại nâng cao | Sửa hàng loạt, danh sách việc quá hạn, quy tắc ưu tiên cuộc hẹn | **💻** | MVP chỉ cần nhập đúng và không mất dữ liệu | +| Nối với CRM hoặc hệ thống đơn hàng | Kết quả bán hàng tự động chảy sang hệ thống nghiệp vụ, không phải nhập hai lần | **💻** | Phụ thuộc hệ thống của khách, chưa xác định | +| Báo cáo kinh doanh | Dashboard tỷ lệ chốt, giá trị đơn, hiệu quả theo nguồn danh sách, theo agent, theo khung giờ | **⚙️+💻** | Cần dữ liệu thật vài tuần mới có ý nghĩa | +| Đăng nhập một lần (SSO) và tự động hóa hạ tầng | Dùng chung tài khoản công ty; cấu hình được phiên bản hóa và triển khai lại được | **⚙️+💻** | Không chặn việc mở dịch vụ | +| Cảnh báo tức thời trong lúc gọi | Khi hội thoại chuyển sang tiêu cực hoặc xuất hiện từ khóa cấm, quản lý được báo ngay để vào hỗ trợ | **⚙️+💻** | Cần chốt danh sách từ khóa và quy trình can thiệp | + +### 2.3 Có thể cân nhắc về sau (Full / R&D) + +| Tính năng | Hệ thống làm gì | **Cách làm** | Điều kiện | +|---|---|:--:|---| +| Quay số dự đoán (predictive) | Hệ thống gọi trước nhiều số hơn số agent đang rảnh, dựa trên xác suất bắt máy, để agent gần như không phải chờ | **⚙️** | Cần dữ liệu thật, quota lớn hơn và kiểm soát tỷ lệ cuộc gọi bị bỏ | +| Tóm tắt cuộc gọi bằng AI | Sau mỗi cuộc, hệ thống tự viết tóm tắt, rút ra vấn đề và việc cần làm | **⚙️** | Cần tinh chỉnh theo nghiệp vụ | +| Trợ lý gợi ý cho agent | Trong lúc nói chuyện, hệ thống gợi ý câu trả lời từ kho tài liệu | **⚙️+💻** | Cần kho nội dung được chuẩn hóa | +| Chấm điểm chất lượng tự động | Hệ thống tự chấm cuộc gọi theo bộ tiêu chí, quản lý chỉ xác nhận | **⚙️** | Cần bộ tiêu chí được thống nhất | +| Xếp ca và dự báo nhân lực | Dự báo lượng việc và xếp ca cho agent | **⚙️** | Cần quy mô lớn hơn | +| Che thông tin cá nhân trong văn bản | Tự động che số thẻ, địa chỉ, tên trong bản text và trong audio | **💻** | Amazon Connect **chưa hỗ trợ** che tự động cho tiếng Nhật; phải tự xây | +| Nhận diện cảm xúc qua chất giọng | Gán nhãn giận / vui / buồn dựa trên đặc trưng âm thanh, không dựa vào nội dung nói | **💻 R&D** | Là đề tài R&D, phải PoC trước, xem §8.3 | +| Dự phòng thảm họa Tokyo–Osaka | Nếu vùng Tokyo gặp sự cố, hệ thống chuyển sang Osaka | **⚙️ + 📄** | Cần gói AWS Enterprise Support và quy trình riêng | + +### 2.4 Tóm tắt: phần nào bật sẵn, phần nào phải viết mới + +Trong 22 tính năng bắt buộc của MVP: + +| Cách làm | Số tính năng | Là những tính năng nào | +|---|---:|---| +| **⚙️ Chỉ cấu hình** | 15 | Phân quyền, tạo đợt gọi, tự động quay số, nhận biết máy trả lời, cùng một số gọi ra, 15 cuộc đồng thời, màn hình agent, ghi âm, chuyển thành văn bản, phân tích sắc thái, nghe lén/chen ngang, tìm kiếm cuộc gọi, bảng theo dõi, báo cáo, nhận cuộc gọi vào | +| **⚙️+💻 Cấu hình + code nhỏ** | 2 | Nạp danh sách (cần script chuẩn hóa số và lọc trước khi đưa vào AWS), cảnh báo sự cố (cần hàm kiểm tra thiếu file) | +| **💻 Phải tự xây** | 4 | Ghi kết quả cuộc gọi, danh sách không gọi, hẹn gọi lại, đối soát dữ liệu | +| **📄 Thủ tục/tài liệu** | 1 | Hồ sơ bảo mật và quyền riêng tư | + +**Nói ngắn gọn với khách:** phần lõi tổng đài — quay số, ghi âm, chuyển thành văn bản, phân tích tiếng Nhật, báo cáo — là **bật sẵn của AWS, không phải phần mềm chúng ta viết**. Phần phải tự xây chỉ tập trung vào **bốn chỗ mà Amazon Connect không có sẵn**: + +| Phải tự xây | Vì sao AWS không có sẵn | +|---|---| +| **Ghi kết quả cuộc gọi** | Connect chỉ lưu kết quả kỹ thuật của máy quay số (bận, hộp thư thoại, không bắt máy). "Đã bán / quan tâm / hẹn lại / không quan tâm" là khái niệm nghiệp vụ, không có kho lưu sẵn để tra cứu và báo cáo | +| **Danh sách không gọi (DNC)** | **Outbound Campaigns không có danh sách chặn dựng sẵn.** Cách duy nhất là gắn cờ trong hồ sơ khách hàng rồi lọc segment trước mỗi đợt gọi — việc gắn cờ và đồng bộ đó phải tự viết | +| **Hẹn gọi lại** | Cơ chế callback sẵn có của Connect phục vụ khách gọi vào chờ máy, không phải lịch hẹn của nhân viên bán hàng theo giờ Nhật, có chống trùng và có trạng thái | +| **Đối soát dữ liệu** | Sự kiện cuộc gọi, file ghi âm, bản phân tích và kết quả bán hàng nằm ở bốn nơi khác nhau. Ghép lại thành một bảng "gọi bao nhiêu → có bao nhiêu ghi âm → bao nhiêu có text" là việc phải viết | + +Ba trong bốn chỗ này (kết quả, DNC, hẹn gọi lại) nằm chung trong hạng mục **M08** của bảng estimate, và đó cũng là hạng mục có nhiều rủi ro kỹ thuật nhất của MVP. + +Ở các phase sau, tỷ lệ đảo chiều: **Standard chủ yếu là code** (màn hình quản lý riêng, tích hợp CRM, kết quả nâng cao), còn **Full core phần lớn lại là bật thêm tính năng có sẵn của AWS** (quay số dự đoán, tóm tắt AI, chấm điểm tự động, xếp ca). + +--- + +## 3. Truy vết từ yêu cầu gốc của khách đến giải pháp + +| Yêu cầu gốc (tiếng Nhật) | Nghĩa là gì | Giải pháp | Phase | Nghiệm thu bằng cách nào | +|---|---|---|---:|---| +| リストをもとに発信できるシステム | Nạp danh sách rồi hệ thống tự gọi, như BlueBean | CSV → danh sách khách → đợt gọi tự động (progressive/preview) | MVP | Nạp file mẫu, dòng lỗi bị trả về đúng lý do, đợt gọi chạy đúng danh sách, đúng khung giờ, đúng quy tắc gọi lại | +| 同じフリーダイヤルで全員が発信できる | Ai gọi ra khách cũng thấy cùng một số của công ty | **Không dùng được 0120 cho quay số tự động.** Dùng một số 03/050 chung cho tất cả agent; 0120 dùng để nhận cuộc gọi | MVP | 15 agent gọi ra đều hiện đúng một số, kiểm tra trên ma trận nhà mạng đã thống nhất; gọi lại vào 0120 được tiếp nhận | +| 15人が同時に発信できる | 15 người nói chuyện cùng lúc không nghẽn | Tăng hạn mức cuộc gọi đồng thời + kiểm thử tải | MVP | 15 cuộc kết nối đồng thời liên tục 30 phút, không có cuộc nào bị báo bận do giới hạn hệ thống | +| 通話は毎回録音してAWSに保存 | Cuộc nào cũng có file ghi âm, nằm trong AWS của công ty | Bật ghi âm trong luồng gọi, lưu S3 mã hóa | MVP | 100% cuộc gọi có người bắt máy đều có audio hai chiều; cuộc không ai bắt máy có bản ghi sự kiện chứ không có audio | +| 通話を毎回テキスト化して保存 | Cuộc nào cũng có bản text để đọc và phân tích | Phân tích hội thoại sau cuộc gọi, tiếng Nhật | MVP | 100% cuộc gọi có hội thoại đủ dài đều tạo được bản text; tìm/đọc/tải theo đúng quyền | +| 声のトーンや感情の分析 | Biết cuộc nào khách khó chịu, agent nói to, nói chen | Sắc thái + độ to giọng + im lặng + nói chen + luật kết hợp | MVP | Nhìn được các chỉ số này trên từng cuộc và trên dashboard; QA xác nhận trên bộ mẫu đã thống nhất | +| (mở rộng) nhãn cảm xúc theo chất giọng | Máy đọc được cảm xúc từ giọng nói | Mô hình học máy riêng, cần dữ liệu gán nhãn | Tùy chọn | Chỉ nghiệm thu theo precision/recall trên bộ dữ liệu tiếng Nhật hai bên chốt trước | +| 一部受信もつくるかもしれません | Có thể làm cả nhận cuộc gọi | **Đã đưa vào MVP** ở mức cơ bản: giờ làm việc, hàng đợi, ngoài giờ | MVP | Test trong giờ/ngoài giờ, hàng đợi, cuộc gọi nhỡ | + +--- + +## 4. Kiến trúc đề xuất + +```mermaid +flowchart LR + CSV[File CSV danh sách khách] --> CP[Danh sách khách hàng
Customer Profiles + Segments] + CP --> OC[Đợt gọi tự động
Outbound Campaigns] + DID[Số gọi ra dùng chung
+81 3 hoặc +81 50] --> OC + OC --> FLOW[Luồng cuộc gọi ra
nhận biết máy trả lời + ghi âm + phân tích] + FLOW --> Q[Hàng đợi outbound] + Q --> AW[Màn hình agent
10-15 người] + AW --> JP[Khách hàng tại Nhật] + + TFN[Số nhận cuộc gọi
0120/0800] --> IF[Luồng nhận cuộc gọi
giờ làm việc + ngoài giờ] + JP -. gọi lại .-> TFN + IF --> Q + + FLOW --> S3[S3: ghi âm + bản text
mã hóa KMS + vòng đời lưu trữ] + FLOW --> CE[Sự kiện cuộc gọi và chiến dịch] + AW --> GUIDE[Form nhập kết quả] + GUIDE --> L[Lambda API] + L --> DDB[DynamoDB
kết quả, hẹn gọi lại, không gọi nữa] + CE --> L + + S3 --> DL[Data lake / Athena] + DDB --> DL + DL --> QS[QuickSight / BI] + CW[CloudWatch + CloudTrail] --- FLOW + CW --- L +``` + +### 4.1 Luồng một cuộc gọi ra, từ đầu đến cuối + +1. Quản lý tải file CSV theo mẫu. +2. Hệ thống kiểm tra: số đúng định dạng E.164, đủ trường bắt buộc, không trùng, có thông tin đồng ý liên hệ, không nằm trong danh sách không gọi. +3. Dữ liệu hợp lệ vào danh sách khách hàng và gom thành nhóm để gọi; số bị loại có báo cáo lý do. +4. Quản lý tạo đợt gọi: chọn số gọi ra, khung giờ, quy tắc gọi lại, giới hạn số lần liên hệ. +5. Hệ thống quay số khi có agent rảnh; phân biệt người thật / hộp thư thoại / thông báo nhà mạng. +6. Có người thật bắt máy thì nối cho agent, đồng thời hiện thông tin khách và kịch bản. +7. Ghi âm và phân tích được bật **trước khi** nối agent. +8. Kết thúc cuộc gọi, agent nhập kết quả. Chọn "không gọi nữa" thì hệ thống chặn số ngay lập tức; chọn "hẹn gọi lại" thì tạo lịch. +9. Sự kiện cuộc gọi và kết quả nghiệp vụ được nối với nhau bằng `contactId`, `campaignId`, `profileId`. +10. Quản lý xem số liệu, nghe ghi âm, đọc text, và xử lý các cuộc bị lỗi. + +### 4.2 Dữ liệu tối thiểu cần lưu + +| Nhóm dữ liệu | Nội dung | Ghi chú | +|---|---|---| +| Khách hàng | mã khách, số điện thoại E.164, tên, nguồn và thời điểm đồng ý liên hệ, cờ không gọi | Nguồn đồng ý là bắt buộc về mặt tuân thủ | +| Đợt gọi | mã đợt, danh sách nguồn, chế độ quay số, số gọi ra, khung giờ, quy tắc gọi lại, trạng thái | | +| Lần gọi | mã cuộc gọi, đợt gọi, khách, agent, các mốc thời gian, kết quả kỹ thuật (bận / không bắt máy / hộp thư thoại) | Kết quả kỹ thuật **không** thay cho kết quả bán hàng | +| Kết quả bán hàng | mã cuộc gọi, mã kết quả, ghi chú, giờ hẹn lại, lý do không gọi nữa, người cập nhật | Do agent nhập | +| File | mã cuộc gọi, đường dẫn ghi âm, đường dẫn bản phân tích, trạng thái xử lý, nhóm thời hạn lưu | Dùng cho đối soát | +| Nhật ký | ai, làm gì, trên dữ liệu nào, khi nào | Phục vụ audit | + +Không đưa thông tin cá nhân, token, đường dẫn ghi âm có chữ ký hay nội dung hội thoại vào log ứng dụng. + +--- + +## 5. Xử lý các phần khó + +### 5.1 Số điện thoại — phần rủi ro nhất của dự án + +**Điều đã được xác minh trong Amazon Connect Telecoms Coverage Guide bản 31/08/2026:** + +| Loại số Nhật | Gọi ra trong nước | Dùng cho quay số tự động | Custom caller ID | Ghi chú | +|---|:--:|:--:|:--:|---| +| DID `+81 3` / `+81 6` | Có | **Có** (`ap-northeast-1`) | Không | Hồ sơ phải chứng minh địa chỉ doanh nghiệp **đúng vùng của area code**; chỉ một số dải số khả dụng | +| DID `+81 50` | Có | **Có** (`ap-northeast-1`) | Không | Dễ xin hơn, nhưng người Nhật ít bắt máy số 050 | +| Toll-free `+81 120` / `+81 800` | Có (gọi tay) | **Không** | Không | Chỉ dùng để nhận cuộc gọi, hoặc gọi ra thủ công | +| UIFN | Không | Không | Không | Chỉ nhận cuộc gọi | + +**Hệ quả bắt buộc phải chấp nhận:** + +- Không có đường "giữ số ở nhà mạng hiện tại rồi chỉ hiển thị" — Nhật **không hỗ trợ custom caller ID**. Số nào muốn dùng thì phải xin mới hoặc chuyển hẳn vào Amazon Connect. +- Nếu chuyển số 0120 đang dùng: nghiệp vụ nào đang chạy trên số đó sẽ bị ảnh hưởng, phải có kế hoạch cắt chuyển. + +**Kế hoạch xử lý:** + +- Tuần 1: mở AWS Support case cho việc xin số, chuyển số, bật gọi ra, và hỏi tồn kho số `+81 3` khả dụng. +- Tuần 1: yêu cầu khách chuẩn bị 3 loại hồ sơ — giấy đăng ký doanh nghiệp cấp trong 6 tháng, ID hoặc hộ chiếu người đại diện có tên trong đăng ký, giấy tờ chứng minh địa chỉ cấp trong 6 tháng. +- Bám **cửa sổ chuyển số: thường là ngày 1 và ngày 15 của tháng kế tiếp**. Trượt một nhịp là chậm nửa tháng. +- Dùng một hàng đợi gọi ra chung và đúng một số gọi ra ở MVP. +- Test hiển thị số trên NTT cố định và các mạng di động do khách chỉ định. +- Không cam kết hiển thị tên doanh nghiệp — điều đó do nhà mạng và máy đầu cuối quyết định. + +### 5.2 Số cuộc gọi đồng thời + +- Hạn mức mặc định: **10** cuộc gọi đồng thời mỗi instance, và **0** cuộc gọi đồng thời cho chiến dịch. Cả hai đều phải xin tăng. +- MVP đặt mục tiêu **25/25** để có khoảng dự phòng, không xin đúng 15. +- Phải tạo instance trước rồi mới xin tăng được. **Yêu cầu lớn có thể mất tới 3 tuần** để AWS duyệt. +- Hạn mức khác cần biết: mặc định **2 instance** mỗi Region (vừa đủ non-prod + prod, không còn chỗ cho sandbox) và **5 số điện thoại** mỗi instance. +- Có cảnh báo khi chạm trần và dashboard theo dõi số cuộc đồng thời. + +### 5.3 "Mọi cuộc gọi đều có ghi âm và text" + +- Chỉ cuộc gọi **có người bắt máy và có hội thoại** mới sinh file ghi âm và bản text. Máy bận, số sai, không ai nghe thì không có gì để ghi — nhưng vẫn có bản ghi sự kiện và kết quả kỹ thuật. +- Bản ghi sự kiện cuộc gọi là nguồn sự thật cho **mọi** lần gọi; ghi âm và bản text là sản phẩm đi kèm khi có hội thoại. +- Hệ thống tự kiểm tra sau 15 phút; thiếu file thì tạo cảnh báo và đưa vào danh sách xử lý tay. Thời gian phân tích một cuộc gọi thường bằng khoảng 40% độ dài cuộc gọi, nên ngưỡng 15 phút là dư an toàn. +- Dashboard tách bạch: đã gọi / kết nối / có ghi âm / có text / phân tích lỗi. +- "Có text" khác với "text chính xác". Cần một bộ khoảng 20 cuộc gọi được người Nhật đối chiếu, thống nhất cách đo lỗi và ngưỡng chấp nhận **trước UAT**, và nạp trước danh sách tên sản phẩm/thương hiệu vào từ điển riêng. + +### 5.4 Nhận biết máy trả lời tự động trong môi trường Nhật + +Tính năng này được huấn luyện chủ yếu trên thị trường nói tiếng Anh. Ở Nhật còn có 留守番電話サービス và các thông báo của nhà mạng như 「おかけになった電話番号は現在使われておりません」 hay 「電波の届かない場所にいるか、電源が入っていない」. Nhận nhầm thì mất khách tiềm năng hoặc lãng phí thời gian agent. + +→ Phải đo trên bộ mẫu thật (cố định, di động, số sai, máy trả lời) và đưa ngưỡng vào tiêu chí nghiệm thu. Nằm trong M11. + +### 5.5 Kết quả bán hàng và danh sách không gọi + +- Kết quả kỹ thuật của máy quay số (bận, hộp thư thoại, không bắt máy) **không** thay cho kết quả bán hàng. +- MVP dùng form nhập kết quả ngay trên màn hình agent, lưu qua Lambda vào DynamoDB. +- Khi chọn "không gọi nữa": cập nhật danh sách chặn trước, rồi mới đồng bộ hồ sơ khách. Mọi đợt gọi mới đều bắt buộc lọc theo điều kiện này. +- Hẹn gọi lại theo giờ Nhật, chống tạo trùng, có trạng thái đến hạn / đã xong / đã hủy. + +### 5.6 "Phân tích tone và cảm xúc" thực sự là gì + +- MVP hiển thị: sắc thái tích cực/trung tính/tiêu cực theo từng đoạn và cả cuộc, độ to giọng, khoảng im lặng, số lần nói chen, và luật kết hợp để tự gắn cờ cuộc cần nghe lại. +- Đây là phân tích **nội dung lời nói**, không phải máy đọc cảm xúc từ chất giọng. Phải thống nhất cách nói này với khách trước khi ký. +- Dùng để chọn cuộc gọi cho QA, **không** dùng để tự động đánh giá năng lực hay đạo đức agent. +- Nếu khách muốn nhãn cảm xúc theo chất giọng, phải PoC trước; chỉ estimate production sau PoC. + +### 5.7 Thông tin cá nhân trong bản ghi âm và text + +- Amazon Connect **chưa hỗ trợ** che tự động thông tin cá nhân cho tiếng Nhật (cột Redaction của `ja_JP` để trống). +- MVP: không đọc số thẻ/thông tin thanh toán qua điện thoại; dùng link thanh toán hoặc kênh đạt chuẩn riêng. Kèm phân quyền chặt và thời hạn lưu ngắn nhất hợp lệ. +- Nếu bắt buộc phải che: là một workstream riêng (X02), phải có bộ test đo được độ chính xác theo từng loại thông tin. + +--- + +## 6. Các phương án triển khai + +| Phương án | Mục tiêu | Phạm vi | Estimate cộng dồn | Lịch tham khảo | +|---|---|---|---:|---:| +| **MVP native-first** | Mở dịch vụ được, chi phí thấp nhất, đủ mọi yêu cầu bắt buộc | Danh sách + đợt gọi tự động, 15 cuộc đồng thời, một số gọi ra dùng chung, nhận cuộc gọi cơ bản, kết quả/không gọi nữa/hẹn lại, ghi âm, text và phân tích tiếng Nhật, báo cáo có sẵn, giám sát và hồ sơ bảo mật | **57–80 PD**; baseline 68 | 9–11 tuần | +| Standard | Dễ vận hành và nối được với nghiệp vụ | MVP + màn hình quản lý danh sách riêng, kết quả/hẹn lại nâng cao, một tích hợp CRM hoặc đơn hàng, dashboard kinh doanh, SSO/IaC/CI-CD | **99–140 PD**; baseline 120 | 13–17 tuần | +| Full core | Tối ưu năng suất và chất lượng | Standard + quay số dự đoán, cảnh báo tức thời, tóm tắt AI, trợ lý agent, chấm điểm tự động, xếp ca, BI nâng cao, SMS follow-up, hardening | **166–240 PD**; baseline 203 | 21–29 tuần | +| Full + R&D/compliance/DR | Nâng cao | Full core + nhận diện cảm xúc theo giọng, che thông tin cá nhân tiếng Nhật, dự phòng Tokyo–Osaka | **221–328 PD** | 29–41 tuần | + +Lịch giả định 2–3 người cho MVP, 3–4 người cho Standard, 4–5 người cho Full, các vai trò có thể kiêm nhiệm. **Thời gian theo lịch không bằng person-day chia cho số người**, vì có UAT, phê duyệt của AWS/nhà mạng và các bước phải làm tuần tự. + +### Khuyến nghị thương mại + +- Chào **MVP Phương án A** nếu khách muốn mở dịch vụ cuối tháng 10 / đầu tháng 11 — và nói rõ mốc này chỉ khả thi nếu hồ sơ xin số được nộp trong tháng 9. +- Báo giá **hai phương án tách bạch** (§9), không đưa một con số duy nhất, vì phương án giữ フリーダイヤル để gọi ra lệch tới +30 PD. +- Chạy pilot 5 agent trong 1 tuần trước khi mở đủ 15 agent. +- Sau 4–6 tuần có dữ liệu thật, quyết định Standard/Full theo tỷ lệ chốt, tỷ lệ bắt máy, thời gian nhập kết quả và nhu cầu của quản lý. +- Nhận diện cảm xúc theo giọng và che thông tin cá nhân tiếng Nhật nên là PoC có điều kiện, không cam kết fixed-price production ngay. + +--- + +## 7. Estimate chi tiết MVP — Phương án A + +| ID | Hạng mục | Làm gì trong hạng mục này | Bàn giao cái gì | PD thấp | PD cao | +|---|---|---|---|---:|---:| +| M01 | Khảo sát nghiệp vụ và tuân thủ | Ngồi với khách chốt quy trình gọi, bộ mã kết quả, quy tắc đồng ý liên hệ và không gọi nữa, thời hạn lưu dữ liệu | Tài liệu quy trình, bộ mã kết quả, ma trận nghiệm thu | 3 | 4 | +| M02 | Thiết kế giải pháp và bảo mật | Vẽ kiến trúc, luồng dữ liệu, phân quyền, mã hóa, các chỉ tiêu phi chức năng | HLD, data flow, mô hình phân quyền | 2 | 3 | +| M03 | Dựng nền tảng AWS | Tạo môi trường non-prod và prod, kho lưu trữ, khóa mã hóa, log, vòng đời dữ liệu, tag và ngân sách | Hai môi trường chạy được | 4 | 5 | +| M04 | Số điện thoại và hạn mức | Chuẩn bị hồ sơ pháp nhân, mở case với AWS, theo cửa sổ chuyển số, xin tăng hạn mức, lên kế hoạch test hiển thị số | Số gọi ra + số nhận vào hoạt động, hạn mức đã duyệt | 4 | 6 | +| M05 | Người dùng và định tuyến | Tạo tài khoản cho 10–15 agent, quản lý, admin; phân nhóm, hàng đợi, hồ sơ định tuyến, thời gian nhập kết quả | Người dùng đăng nhập và nhận cuộc gọi được | 2 | 3 | +| M06 | Danh sách và đợt gọi | Mẫu CSV, quy tắc kiểm tra dữ liệu, gom nhóm khách, cấu hình quay số, quy tắc gọi lại, khung giờ, giới hạn liên hệ | Nạp danh sách và chạy đợt gọi được | 5 | 7 | +| M07 | Luồng cuộc gọi, ghi âm, phân tích | Dựng luồng gọi ra, bật ghi âm hai chiều, bật phân tích tiếng Nhật, nạp từ điển riêng, xử lý nhánh lỗi | Cuộc gọi có audio và text | 4 | 5 | +| M08 | Kết quả, không gọi nữa, hẹn lại | Form nhập kết quả trên màn hình agent, API lưu trữ, danh sách chặn, quy tắc lọc trước khi gọi, trường phục vụ audit | Agent nhập được kết quả, số bị chặn không bị gọi lại | 5 | 7 | +| M09 | Công cụ cho quản lý | Tìm kiếm cuộc gọi, quyền nghe/tải ghi âm, báo cáo lưu sẵn, nghe lén / nhắc riêng / chen ngang | Quản lý giám sát được đội | 3 | 4 | +| M10 | Giám sát và vận hành | Cảnh báo, dashboard, kiểm tra thiếu file, nhật ký thao tác, khung tài liệu xử lý sự cố | Bộ cảnh báo có chủ và có hướng dẫn xử lý | 2 | 3 | +| M11 | Kiểm thử kỹ thuật và tải | Test luồng, ma trận nhà mạng, đo nhận biết máy trả lời trên mẫu tiếng Nhật, test trình duyệt/tai nghe, 15 cuộc đồng thời, các ca lỗi | Báo cáo test và bằng chứng | 6 | 9 | +| M12 | UAT và ổn định | Hỗ trợ khách nghiệm thu, sửa lỗi, pilot 5 agent, mở rộng 15 agent, hypercare 10 ngày làm việc ở mức 0.5 FTE | Hệ thống chạy thật | 4 | 5 | +| M13 | Tài liệu và đào tạo (tiếng Nhật) | Sổ tay admin / agent / quản lý, từ điển dữ liệu, 3 buổi đào tạo — toàn bộ bằng tiếng Nhật | Bộ tài liệu và đào tạo | 4 | 6 | +| M14 | Quản lý dự án | Kế hoạch, quản lý rủi ro, làm việc với AWS và khách, báo cáo tiến độ, kiểm soát phát hành | Điều hành dự án | 3 | 4 | +| M15 | Nhận cuộc gọi (mức cơ bản) | Giờ làm việc, lời chào, hàng đợi, xử lý ngoài giờ và cuộc gọi nhỡ, ghi âm/phân tích giống outbound | Khách gọi lại được tiếp nhận | 5 | 7 | +| M16 | Hồ sơ bảo mật và quyền riêng tư | Bảng kiểm bảo mật, tài liệu quản lý bên nhận ủy thác, quy trình khi cá nhân yêu cầu xem/xóa dữ liệu | Bộ hồ sơ nộp cho khách | 1 | 2 | +| | **Tổng MVP Phương án A** | | | **57** | **80** | + +**Baseline lập kế hoạch: 68 PD.** + +So với bản 1 (46–63 PD): chênh lệch đến từ việc đưa nhận cuộc gọi vào bắt buộc (+5–7), mở rộng phần số điện thoại theo quy trình Nhật (+2–3), thêm nghe lén/nhắc riêng/chen ngang (+1), thêm đo nhận biết máy trả lời (+1–2), thêm hồ sơ bảo mật (+1–2), và tài liệu/đào tạo hoàn toàn bằng tiếng Nhật (+1–2). + +### 7.1 Cùng số đó, nhìn theo "phải viết code hay chỉ cấu hình" + +Đây là cách đọc estimate mà khách hàng thường muốn thấy nhất — tiền bỏ ra đi vào việc gì: + +| Loại công việc | Nằm ở hạng mục nào | PD thấp | PD cao | Tỷ trọng | +|---|---|---:|---:|---:| +| ⚙️ **Cấu hình dịch vụ AWS có sẵn** | M03, M05, M07, M09, M15, phần cấu hình của M06, M10 | 22 | 29 | ~37% | +| 💻 **Code tự viết** | M08 toàn bộ; script chuẩn hóa danh sách trong M06; hàm kiểm tra thiếu file và đối soát trong M10 | **8** | **12** | **~15%** | +| 🔍 Khảo sát và thiết kế | M01, M02 | 5 | 7 | ~9% | +| 📄 Thủ tục với AWS và nhà mạng | M04 | 4 | 6 | ~7% | +| ✅ Kiểm thử và nghiệm thu | M11, M12 | 10 | 14 | ~18% | +| 📘 Tài liệu, đào tạo, hồ sơ bảo mật | M13, M16 | 5 | 8 | ~9% | +| 📋 Quản lý dự án | M14 | 3 | 4 | ~5% | +| | **Tổng** | **57** | **80** | 100% | + +Ba điều đáng nói với khách từ bảng này: + +1. **Chỉ khoảng 15% công sức là viết phần mềm mới.** Phần lớn tiền đi vào cấu hình đúng, kiểm thử thật và bàn giao được — chứ không phải xây một hệ thống từ đầu. Đây chính là lý do chọn Amazon Connect thay vì tự dựng tổng đài. +2. **Kiểm thử chiếm tỷ trọng gần bằng cấu hình.** Với call center, rủi ro không nằm ở chỗ tính năng chạy được, mà ở chỗ hiển thị số đúng trên mọi nhà mạng, âm thanh nghe rõ, và không mất dữ liệu cuộc gọi. Cắt phần này là cắt vào chỗ nguy hiểm nhất. +3. **Nếu chọn Phương án B (giữ 0120 để gọi ra), phần code tăng gấp ba** — từ 8–12 PD lên 26–42 PD, tức khoảng 35–38% khối lượng, vì phải tự xây lại bộ quay số mà AWS vốn cho sẵn. Đó là chi phí thật của việc giữ số フリーダイヤル, và nó còn kéo dài sang chi phí bảo trì về sau. + +--- + +## 8. Estimate phần tăng thêm + +### 8.1 Lên Standard + +| ID | Hạng mục tăng thêm | Làm gì | PD thấp | PD cao | +|---|---|---|---:|---:| +| S01 | Màn hình quản lý danh sách riêng | Trang web tiếng Nhật để nạp danh sách, xem tiến độ, chia việc, sửa dữ liệu, xem lỗi và nhật ký | 10 | 14 | +| S02 | Kết quả và hẹn gọi lại nâng cao | Sửa hàng loạt, danh sách quá hạn, quy tắc ưu tiên | 6 | 9 | +| S03 | Một tích hợp CRM hoặc đơn hàng | Đồng bộ hai chiều với một hệ thống nghiệp vụ | 7 | 11 | +| S05 | Dashboard kinh doanh | Kho dữ liệu, truy vấn và biểu đồ theo tỷ lệ chốt, nguồn danh sách, agent, khung giờ | 7 | 10 | +| S06 | SSO, IaC và CI/CD | Đăng nhập bằng tài khoản công ty, cấu hình được phiên bản hóa và triển khai lại | 6 | 8 | +| S07 | Kiểm thử, tài liệu, PM cho phần tăng thêm | | 6 | 8 | +| | **Tổng tăng thêm Standard** | | **42** | **60** | +| | **Cộng dồn MVP + Standard** | | **99** | **140** | + +> Mục S04 (nhận cuộc gọi) của bản 1 đã được chuyển vào MVP, nên **không** cộng lại ở đây. + +Mỗi hệ thống CRM/đơn hàng bổ sung ngoài hệ đầu tiên: tạm tính **6–12 PD/hệ**, phải estimate lại theo chất lượng API và dữ liệu. + +### 8.2 Lên Full core + +| ID | Hạng mục tăng thêm | PD thấp | PD cao | +|---|---|---:|---:| +| F01 | Quay số dự đoán: pilot, điều tiết nhịp gọi, kiểm soát cuộc bị bỏ, tinh chỉnh hạn mức | 5 | 8 | +| F02 | Cảnh báo tức thời theo nội dung/sắc thái và quy trình can thiệp của quản lý | 5 | 8 | +| F03 | Tóm tắt cuộc gọi bằng AI, rút trích kết quả và việc cần làm | 5 | 8 | +| F04 | Trợ lý gợi ý cho agent và kho tri thức | 8 | 12 | +| F05 | Chấm điểm chất lượng tự động, lấy mẫu, hiệu chuẩn, coaching | 6 | 9 | +| F06 | Dự báo và xếp ca | 5 | 8 | +| F07 | BI nâng cao: phễu, nhóm khách, chất lượng theo agent/đợt gọi, lưu trữ dài hạn | 8 | 12 | +| F08 | SMS/email theo sau cuộc gọi | 5 | 8 | +| F09 | Hardening bảo mật, kiểm thử xâm nhập, tải và khả năng phục hồi | 8 | 12 | +| F10 | UAT toàn diện, triển khai, đào tạo, quản trị thay đổi và PM | 12 | 15 | +| | **Tổng tăng thêm Full core** | **67** | **100** | +| | **Cộng dồn đến Full core** | **166** | **240** | + +### 8.3 Tùy chọn nâng cao ngoài Full core + +| ID | Tùy chọn | Nội dung | PD thấp | PD cao | +|---|---|---|---:|---:| +| X01 | Nhận diện cảm xúc theo giọng | Định nghĩa nhãn, kế hoạch gán nhãn, PoC, đánh giá, pipeline xử lý, người xem lại, MLOps tối thiểu | 25 | 40 | +| X02 | Che thông tin cá nhân tiếng Nhật | Xác định loại thông tin, bộ phát hiện, canh thời gian, che trong text và audio, kho bản gốc hạn chế, QA | 18 | 30 | +| X03 | Dự phòng Tokyo–Osaka | Điều kiện, thiết kế, nhân bản tài nguyên, chuyển số và agent, dữ liệu, diễn tập | 12 | 18 | +| | **Tổng ba tùy chọn** | | **55** | **88** | +| | **Full core + ba tùy chọn** | | **221** | **328** | + +**X01 nên được trình bày như một đề xuất PoC riêng có tiêu chí dừng, không phải một dòng trong bảng giá.** Con số 25–40 PD chỉ là phần production tối thiểu sau khi đã có dữ liệu gán nhãn; chi phí thu thập và gán nhãn diện rộng, review pháp lý và license mô hình bên thứ ba không bao gồm. + +--- + +## 9. Phương án B — nếu khách bắt buộc gọi ra bằng フリーダイヤル + +Vì Amazon Connect không cho dùng số 0120 làm số phát cho quay số tự động, muốn giữ yêu cầu này thì phải **tự xây bộ quay số**. Đây là việc mà hướng native-first vốn dĩ tránh được. + +| ID | Hạng mục tăng thêm so với Phương án A | PD thấp | PD cao | +|---|---|---:|---:| +| B01 | PoC bắt buộc: xác nhận gọi ra bằng 0120 hoạt động thật, và kiểm tra khả năng dùng cơ chế callback để có nhận biết máy trả lời | 5 | 8 | +| B02 | Bộ quay số tự xây: hàng đợi danh sách, điều tiết nhịp gọi, gọi lại, khung giờ, giới hạn liên hệ, lọc danh sách chặn trước khi gọi | 10 | 16 | +| B03 | Xử lý thay thế cho nhận biết máy trả lời và điều chỉnh thao tác của agent | 2 | 4 | +| B04 | Kiểm thử và vận hành bổ sung | 1 | 2 | +| | **Tổng tăng thêm** | **18** | **30** | +| | **MVP Phương án B** | **75** | **110** | + +Nhìn theo cách phân loại ở §7.1: Phương án B đẩy phần **code tự viết từ 8–12 PD lên 26–42 PD**, và toàn bộ phần tăng thêm đó là phần mềm do dự án tự bảo trì, không được AWS nâng cấp theo thời gian. + +Rủi ro của Phương án B, phải nói rõ với khách trước khi ký: + +- **Mất tính năng nhận biết máy trả lời tự động.** Block này chỉ hoạt động cho cuộc gọi của chiến dịch và cuộc gọi lại kiểu khách được nối trước; các loại khác đều rơi vào nhánh lỗi. Agent sẽ phải tự nghe và tự bỏ qua hộp thư thoại. +- Toàn bộ phần lịch gọi, gọi lại, giới hạn tần suất phải tự xây và tự bảo trì, thay vì dùng tính năng có sẵn được AWS cập nhật. +- Không có PoC thì không nên cam kết. Đề nghị tách B01 thành một hợp đồng nhỏ trước. + +--- + +## 10. Vai trò và kế hoạch MVP tham khảo + +| Vai trò | Tỷ lệ tham gia trung bình | Trách nhiệm | +|---|---:|---| +| PM/BA biết tiếng Nhật | 0.3 FTE | Yêu cầu, làm việc với khách, UAT, rủi ro, đào tạo | +| Kiến trúc sư Connect/AWS | 0.3 FTE | Kiến trúc, luồng gọi, số điện thoại, hạn mức, bảo mật | +| Kỹ sư cloud/backend | 0.4 FTE | Lambda, DynamoDB, sự kiện, giám sát | +| Kỹ sư Connect | 0.4 FTE | Instance, người dùng, định tuyến, đợt gọi, phân tích | +| QA | 0.2 FTE, tăng ở giai đoạn cuối | Thiết kế test, E2E, đồng thời, UAT | +| | **≈ 1.6 FTE trung bình** | | + +> **Lưu ý cách đọc bảng này.** 68 PD trải trên khoảng 10 tuần (50 ngày làm việc) tương đương **khoảng 1.4–1.6 FTE trung bình**, không phải 3–4 người toàn thời gian. Bản 1 của tài liệu ghi 3.1–3.7 FTE, tương đương 124–185 PD năng lực — lệch 2–3 lần so với chính estimate của nó. Nếu báo giá theo FTE × tháng thì phải dùng bảng này, nếu không giá sẽ bị đội gấp đôi. +> +> Lịch dài hơn số PD vì có các giai đoạn chờ: chờ AWS duyệt hạn mức, chờ cửa sổ chuyển số, chờ khách nghiệm thu. Trong các giai đoạn đó đội không trực toàn thời gian. + +```mermaid +gantt + title Lịch MVP tham khảo - các mốc số điện thoại là mốc cứng + dateFormat YYYY-MM-DD + axisFormat %d/%m + section Mốc cứng ngoài tầm kiểm soát + Nộp hồ sơ xin/chuyển số :milestone, m1, 2026-09-11, 0d + Cửa sổ chuyển số 15/10 :milestone, m2, 2026-10-15, 0d + Cửa sổ chuyển số 01/11 :milestone, m3, 2026-11-01, 0d + AWS duyệt tăng hạn mức (tối đa 3 tuần) :a2, 2026-09-08, 21d + section Discovery + Yêu cầu nghiệp vụ + quyết định legal :a1, 2026-09-07, 7d + section Build + Nền tảng + cấu hình Connect :b1, after a1, 10d + Đợt gọi + luồng gọi + phân tích :b2, after b1, 12d + Kết quả/không gọi nữa/hẹn lại :b3, after b1, 12d + Nhận cuộc gọi cơ bản :b4, after b2, 5d + section Verify + Tích hợp + test 15 cuộc đồng thời :c1, after b2, 7d + UAT + pilot 5 agent :c2, after c1, 7d + Mở rộng 15 agent + hypercare :c3, after c2, 10d +``` + +Ngày trong biểu đồ chỉ minh họa với giả định kickoff 07/09/2026. **Mốc 「10月後半」 chỉ khả thi nếu hồ sơ xin số được nộp trong tháng 9 và số về kịp cửa sổ 15/10.** Nếu trượt sang cửa sổ 01/11 thì lịch mở dịch vụ phải lùi tương ứng. Đây không phải cam kết lịch khi chưa có xác nhận của AWS. + +--- + +## 11. Tiêu chí phi chức năng và điều kiện mở dịch vụ + +### Năng lực và chất lượng + +- 15 cuộc gọi kết nối đồng thời, duy trì ít nhất 30 phút. +- Không chạm trần hạn mức của Connect; không rớt cuộc do lỗi ứng dụng trong test tải. +- Test kết nối thành công trên từng máy agent; độ trễ trung bình không vượt 300 ms. +- Âm thanh hai chiều nghe rõ trên ma trận nhà mạng do khách chốt. +- Nhận biết máy trả lời đạt ngưỡng đã thống nhất trên bộ mẫu tiếng Nhật. + +### Đầy đủ dữ liệu + +- 100% cuộc gọi kết nối trong test có bản ghi cuộc gọi. +- 100% cuộc gọi kết nối có hội thoại đủ dài có ghi âm hai chiều và phân tích thành công, trừ lỗi phía AWS đã được ghi nhận và mở ticket. +- Độ chính xác của bản text được đo trên bộ mẫu tiếng Nhật đã đối chiếu; ngưỡng chấp nhận được hai bên ký **trước** UAT, thay vì mặc định "phải đúng 100%". +- 100% số được đánh dấu không gọi nữa bị loại trước đợt gọi kế tiếp. +- Có báo cáo đối soát: đã gọi → kết nối → ghi âm → text → kết quả bán hàng. + +### Bảo mật và vận hành + +- Agent không nghe hoặc tải được ghi âm ngoài phạm vi được cấp. +- Kho lưu trữ chặn truy cập công khai; chính sách và vòng xoay khóa mã hóa được review. +- Không có thông tin cá nhân trong log ứng dụng và log luồng gọi mẫu. +- Mỗi cảnh báo có người chịu trách nhiệm và có hướng dẫn xử lý; đã diễn tập khôi phục cấu hình. +- Legal ký duyệt kịch bản, thông báo ghi âm và mục đích sử dụng, thời hạn lưu, quy tắc không gọi nữa và khung giờ gọi. + +--- + +## 12. Rủi ro, phụ thuộc và loại trừ + +| Rủi ro / phụ thuộc | Ảnh hưởng | Cách xử lý | +|---|---|---| +| **0120 không dùng được cho quay số tự động** | Sai kiến trúc nếu không phát hiện sớm | Đã chuyển sang Phương án A; nếu khách bắt buộc giữ 0120 thì chuyển sang Phương án B kèm PoC | +| Số về chậm hoặc trượt cửa sổ chuyển số 1/15 | Trễ ngày mở dịch vụ | Nộp hồ sơ tuần 1, bám cửa sổ, chuẩn bị số dự phòng | +| Không xin được số 03 do điều kiện địa chỉ hoặc hết số | Phải dùng 050, tỷ lệ bắt máy thấp hơn | Hỏi tồn kho số ngay tuần 1, cho khách biết trước sự đánh đổi | +| Hạn mức chưa được duyệt (có thể mất tới 3 tuần) | Không đạt 15 cuộc đồng thời | Xin 25/25 sớm, kèm dự báo lưu lượng, test tải | +| **Số gọi ra bị gắn nhãn 迷惑電話** | Tỷ lệ bắt máy tụt dần mà không có lỗi kỹ thuật nào | Theo dõi tỷ lệ bắt máy hằng ngày như chỉ số cảnh báo sớm; đăng ký thông tin doanh nghiệp cho số; nếu nghiêm trọng thì phải nới yêu cầu "một số duy nhất" | +| **Năng suất progressive thấp hơn kỳ vọng BlueBean** | Khách thấy hệ thống chậm dù nghiệm thu kỹ thuật đạt | Chốt chỉ tiêu số cuộc/agent/ngày ngay ở discovery; nếu cần volume thì đưa F01 lên sớm | +| **Quản lý phải thao tác trên màn hình quản trị AWS** | MVP bị đánh giá "không dùng được trên thực tế" | Demo màn hình thật ngay trong discovery, chốt quy trình vận hành hằng ngày bằng văn bản, cảnh báo trước khả năng phải kéo S01 lên MVP | +| **Chốt hợp đồng qua điện thoại kéo theo 書面交付 và クーリング・オフ** | Thiếu quy trình bắt buộc theo 特商法 | Hỏi khách ngay; nếu có thì bổ sung workstream riêng, có legal Nhật xác nhận | +| Nhận biết máy trả lời sai trong môi trường Nhật | Mất khách tiềm năng hoặc lãng phí agent | Đo trên bộ mẫu thật, đưa ngưỡng vào nghiệm thu | +| Dữ liệu CSV bẩn, thiếu thông tin đồng ý hoặc múi giờ | Gọi sai hoặc nạp lỗi | Mẫu chuẩn, quy tắc kiểm tra, báo cáo dòng lỗi, khách chỉ định người chịu trách nhiệm dữ liệu | +| "Cảm xúc" không có định nghĩa đo được | Tranh chấp khi nghiệm thu | Chốt trước: dùng chỉ số có sẵn, hay cần mô hình riêng có KPI | +| Không có che thông tin cá nhân tiếng Nhật | Rủi ro riêng tư | Hạn chế dữ liệu đọc qua điện thoại, phân quyền, thời hạn lưu ngắn; X02 nếu bắt buộc | +| Quay số dự đoán tạo cuộc gọi im lặng | Khiếu nại, rủi ro pháp lý | MVP dùng progressive; predictive chỉ sau pilot và có ngưỡng kiểm soát | +| Mạng hoặc tai nghe của agent kém | Âm thanh xấu, text sai | LAN có dây, tai nghe USB, test kết nối và nhà mạng | +| Thay đổi luật, giá hoặc dịch vụ AWS | Đổi phạm vi hoặc chi phí | Review lại tài liệu và bảng giá trước khi báo giá và trước khi mở dịch vụ | + +Không bao gồm trong estimate cơ sở: + +- mua laptop, tai nghe, router, đường truyền, setup văn phòng; +- phí AWS, AWS Support, số điện thoại, cước viễn thông, SMS/email, license QuickSight; +- dịch và soạn kịch bản bán hàng, tư vấn pháp lý, xin đồng ý liên hệ từ khách hàng cuối; +- làm sạch dữ liệu thủ công khối lượng lớn; +- thanh toán/PCI, quản lý đơn hàng, CRM đầy đủ; +- di chuyển dữ liệu lịch sử; +- vận hành 24x7 hoặc hợp đồng SLA dài hạn; +- gán nhãn dữ liệu khối lượng lớn và license AI bên thứ ba; +- quá một hệ thống CRM/tích hợp ở mức Standard. + +--- + +## 13. Các câu hỏi phải chốt sau discovery + +**Nhóm quyết định kiến trúc — phải trả lời trước khi báo giá:** + +1. **Nếu buộc phải chọn một: ưu tiên hiển thị フリーダイヤル khi gọi ra, hay ưu tiên tự động quay số theo danh sách?** Đây là câu hỏi quan trọng nhất của dự án. +2. Có chấp nhận hiển thị số 03 (Tokyo) khi gọi ra và giữ 0120 chỉ để nhận cuộc gọi không? +3. Số 0120 hiện có đang ở nhà mạng nào, hợp đồng ra sao, và có chấp nhận **chuyển hẳn** sang AWS không? Nghiệp vụ nào đang chạy trên số đó? +4. Đã có đăng ký pháp nhân và địa chỉ thuộc vùng của area code muốn dùng chưa? Bộ 3 hồ sơ khi nào nộp được? + +**Nhóm quyết định phạm vi và quy mô:** + +5. "Cuối tháng 10 / đầu tháng 11" là ngày pilot hay ngày chạy đủ 15 agent? +6. Mục tiêu số cuộc gọi mỗi agent mỗi ngày và tỷ lệ bắt máy kỳ vọng là bao nhiêu? +7. Bao nhiêu lead mỗi ngày, gọi trong khung giờ nào, thời lượng trung bình dự kiến? +8. Danh sách đến từ CSV hay CRM nào; ai chịu trách nhiệm về việc đã có đồng ý liên hệ và chất lượng dữ liệu? +9. Bộ mã kết quả, quy tắc gọi lại, cam kết thời gian gọi lại và phạm vi danh sách không gọi cụ thể là gì? +10. Ai là người thao tác hằng ngày (nạp danh sách, tạo đợt gọi)? Người đó dùng được màn hình quản trị AWS bằng tiếng Nhật không, hay bắt buộc phải có màn hình riêng? +11. Agent ngồi ở Nhật hay nước khác? Có dùng VPN/VDI không? + +**Nhóm tuân thủ và dữ liệu:** + +12. **Có chốt hợp đồng ngay trên điện thoại không?** Nếu có thì ai lo việc giao 契約書面 và quy trình クーリング・オフ 8 ngày? +13. Thời hạn lưu ghi âm và bản text là bao lâu; ai được nghe, tải, xóa? +14. Có nói hoặc thu thập thông tin thanh toán, sức khỏe hay dữ liệu nhạy cảm khác trong cuộc gọi không? +15. Khách có yêu cầu bảng kiểm bảo mật hoặc tài liệu quản lý bên nhận ủy thác theo mẫu riêng không? + +**Nhóm kỹ thuật và vận hành:** + +16. "Phân tích tone/cảm xúc" dùng để làm gì, và chấp nhận các chỉ số có sẵn hay cần nhãn theo chất giọng? +17. Chỉ số bắt buộc trên dashboard là gì: số cuộc gọi, tỷ lệ kết nối, tỷ lệ chốt, doanh số, thời gian nhập kết quả hay điểm chất lượng? +18. **Ngân sách vận hành AWS mỗi tháng** là bao nhiêu? (quyết định bật phân tích cho 100% cuộc gọi hay lấy mẫu) +19. Danh sách số điện thoại dùng để test do ai cung cấp và khi nào? +20. Có yêu cầu SSO, IaC, multi-account, dự phòng thảm họa, RTO/RPO hay chuẩn bảo mật bắt buộc nào không? diff --git a/03-review.md b/03-review.md new file mode 100644 index 0000000..c07316c --- /dev/null +++ b/03-review.md @@ -0,0 +1,130 @@ +# Review phạm vi, giải pháp và estimate + +Ngày review: **03/09/2026** (review nội bộ lần 1) +Tài liệu được review: `01-nghien-cuu-cong-nghe.md`, `02-giai-phap-va-estimate.md`. + +> ⚠️ **Tài liệu này đã bị thay thế một phần.** Review độc lập lần 2 (`04-review-doc-lap.md`) phát hiện review lần 1 **bỏ sót một lỗi chặn**: số toll-free 0120/0800 của Nhật không dùng được cho Outbound Campaigns, và Nhật không hỗ trợ custom caller ID. Các mục §2, §4, §5 và §7 dưới đây đã được cập nhật theo phát hiện đó. Số liệu estimate hiện hành nằm ở `02-giai-phap-va-estimate.md` bản sửa lần 2. +> +> **Bài học rút ra cho quy trình review:** lần 1 chỉ đọc lại kết luận trong tài liệu nghiên cứu, không mở nguồn gốc. Điểm sai nằm ở chỗ tài liệu nghiên cứu đọc đúng cột `National Outbound` nhưng bỏ qua cột `Outbound Campaign Regions` của cùng một bảng. Với các khẳng định quyết định kiến trúc, review phải mở đúng bảng gốc và đọc từng ô, không dựa vào diễn giải. + +## 1. Kết luận review + +**Đạt để dùng làm bản estimate/pre-proposal sau khi đã sửa theo review lần 2**, với điều kiện ghi rõ đây là ROM estimate dựa trên assumption và phải qua discovery trước khi ký fixed-price. + +Các yêu cầu gốc đều đã có giải pháp, phase và acceptance criteria. Estimate không chỉ tính cấu hình Amazon Connect mà đã bao gồm các phần thường bị bỏ sót: business disposition, DNC, callback, quota/number engineering, monitoring, concurrency test, UAT, tài liệu, đào tạo và PM. + +## 2. Review coverage yêu cầu + +| Hạng mục | Trạng thái | Nhận xét review | +|---|---|---| +| List-based outbound | Đủ | Có CSV/Profile/Segment/Campaign, validation, retry và schedule | +| Một toll-free dùng chung | ❌ **Không đạt — đã sửa ở bản 2** | Toll-free Nhật không nằm trong outbound campaign regions và Nhật không có custom caller ID. Đã chuyển sang Phương án A: DID dùng chung để gọi ra, 0120 để nhận cuộc gọi | +| 15 simultaneous | Đủ | Đã phát hiện quota mặc định 10/0, có headroom 25/25 và load test | +| Recording vào AWS | Đủ | Có flow, S3/KMS, RBAC, lifecycle, failure reconciliation | +| Transcript mỗi call | Đủ sau khi định nghĩa lại | Chỉ connected eligible-speech calls; failed/no-answer có event chứ không có transcript | +| Sentiment/tone | Đủ, không over-promise | Native signal rõ ràng; acoustic emotion tách thành R&D option | +| Inbound tiềm năng | ⚠️ **Đã chuyển thành must-have** | Hiển thị một số chung để gọi ra thì chắc chắn có khách gọi lại; để trống số đó là mất lead và tạo rủi ro khiếu nại | +| Compliance Nhật | Đã bổ sung | Consent/DNC/script/purpose/retention và nguồn cơ quan Nhật | +| Vận hành production | Đủ cho MVP | Alarm, audit, runbook, training, pilot và hypercare — bản 2 đã định lượng hypercare 10 ngày làm việc ở mức 0.5 FTE | +| Giám sát chất lượng agent | ⚠️ **Thiếu ở bản 1** | Nghe lén / nhắc riêng / chen ngang không có trong danh sách must-have; đã bổ sung vào MVP | +| Chi phí vận hành hàng tháng | ⚠️ **Thiếu ở bản 1** | Chỉ có công thức, không có con số. Bản 2 đã thêm ba kịch bản minh họa với giả định hiện rõ | + +## 3. Review kiến trúc + +### Điểm hợp lý + +- Native-first giảm code: Customer Profiles/Segments và Guided Campaign Builder thay cho việc tự xây dialer. +- Dùng progressive ở MVP phù hợp quy mô 15 agent và giảm rủi ro abandonment so với predictive. +- Shared queue/source number là cách đúng để dùng caller ID chung — nhưng **số đó phải là DID**, không phải toll-free (xem §2). +- Recording, transcript và analytics liên kết bằng contact ID; business outcome tách riêng nhưng join được. +- DNC là suppression toàn hệ thống, không bị nhầm với communication frequency cap. +- Data lake/QuickSight chỉ đưa vào Standard/Full nên MVP không bị đội chi phí. +- Custom emotion, PII redaction và DR được tách option vì có uncertainty/dependency lớn. + +### Điều kiện cần xác minh bằng PoC/Support + +1. ~~Chính số 0120/0800 của khách có được dùng làm source number cho Outbound Campaigns không.~~ **Đã có câu trả lời: không.** Xác minh trực tiếp trong Telecoms Coverage Guide 31/08/2026; vẫn nên lấy xác nhận bằng văn bản của AWS Support để đưa vào hồ sơ. +2. Tồn kho số `+81 3` khả dụng cho campaign tại `ap-northeast-1`, và điều kiện của footnote (2) về "chỉ một số dải số nhất định". +3. Caller ID hiển thị trên các carrier/handset mục tiêu như kỳ vọng không. +4. Với Phương án B': customer-first callback có dùng được caller ID toll-free và block `Check call progress` không. +3. Chất lượng transcript/sentiment tiếng Nhật trên giọng, thuật ngữ và môi trường thật. +4. Agent Workspace Guide có đủ UX cho outcome/callback của quy trình cuối cùng; nếu không, chuyển sang thin portal Standard. +5. Chính sách retention/deletion có đáp ứng legal và quy định nội bộ không. + +## 4. Review estimate và phép cộng + +Phép cộng của bản 1 đã được kiểm tra lại và **đều đúng về mặt số học**. Nhưng phạm vi đã đổi sau review lần 2, nên con số hiện hành là cột bên phải: + +| Nhóm | Bản 1 | **Bản 2 (hiện hành)** | Vì sao đổi | +|---|---|---|---| +| MVP | 46–63 | **57–80**, baseline 68 | Inbound vào must-have (+5–7); mở rộng phần số điện thoại (+2–3); nghe lén/chen ngang (+1); đo AMD tiếng Nhật (+1–2); hồ sơ bảo mật (+1–2); tài liệu và đào tạo hoàn toàn bằng tiếng Nhật (+1–2) | +| Inbound add-on | 5–7 tách riêng | đã gộp vào MVP | Không còn là tùy chọn | +| Standard increment | 47–67 | **42–60** | Bỏ S04 vì inbound đã nằm trong MVP | +| Cộng dồn Standard | 93–130 | **99–140**, baseline 120 | | +| Full core increment | 67–100 | 67–100 | Không đổi | +| Cộng dồn Full core | 160–230 | **166–240**, baseline 203 | | +| Advanced options X01–X03 | 55–88 | 55–88 | Không đổi; X01 nên tách khỏi bảng giá chính | +| Full core + tất cả option | 215–318 | **221–328** | | +| **Phương án B (giữ 0120 gọi ra)** | không có | **75–110** cho MVP | Phải tự xây dialer, +18–30 PD, và mất AMD native | + +### Đánh giá mức estimate + +- **MVP 57–80 PD là hợp lý** cho production nhỏ nhưng có compliance/data/analytics; thấp hơn đáng kể chỉ khả thi nếu bỏ disposition/DNC custom, bỏ non-prod hoặc giảm test — không được khuyến nghị. +- **Standard 99–140 PD hợp lý** khi có portal, một integration và BI. Điểm biến động lớn nhất là API/data quality của CRM/order system. +- **Full core 166–240 PD hợp lý ở mức ROM**. AI/QA/WFM cần business tuning và change management, không chỉ cấu hình kỹ thuật. +- **Phương án B 75–110 PD** chỉ nên báo giá sau khi PoC B01 kết thúc; trước đó chỉ báo giá phần PoC. +- **X01 emotion 25–40 PD chỉ là production track tối thiểu sau khi scope dataset rõ**; nếu phải tự thu/label hàng nghìn giờ audio, effort sẽ lớn hơn và phải estimate riêng. +- **X02 redaction 18–30 PD là PoC-to-limited-production**, không phải chứng nhận không bao giờ lọt PII. Entity scope và accuracy target có thể làm estimate tăng mạnh. +- **X03 DR 12–18 PD** chỉ tính work kỹ thuật sau khi khách đủ AWS Support/eligibility; phí/support lead time không bao gồm. + +## 5. Kiểm tra double-count và phần thiếu + +### Không double-count + +- Inbound là add-on MVP nhưng đã nằm trong Standard increment. Khi báo giá Standard, không cộng thêm add-on inbound lần nữa. +- Standard cumulative = MVP core + Standard increment; Full cumulative = Standard cumulative + Full increment. +- Native post-call analytics nằm trong MVP; F03 chỉ tính tuning/extraction nghiệp vụ bằng AI, không tính lại việc bật transcript. +- Native reports nằm trong MVP; S05/F07 tính data pipeline và BI nghiệp vụ nâng cao. + +### Các phần cố ý loại khỏi estimate + +- AWS/telco/legal waiting time; +- phí cloud/telephony/equipment; +- tư vấn pháp lý và chuẩn bị consent; +- làm sạch dữ liệu khối lượng lớn; +- payment/PCI và CRM đầy đủ; +- managed service 24x7; +- dataset labeling lớn cho ML. + +**Đính chính:** kết luận "không thiếu hạng mục bắt buộc nào" của review lần 1 là **sai**. Review lần 2 phát hiện thiếu: nhận cuộc gọi ở mức cơ bản, nghe lén/nhắc riêng/chen ngang, đo AMD trên mẫu tiếng Nhật, hồ sơ bảo mật và quyền riêng tư, bảng chi phí vận hành, quy trình 書面交付 / クーリング・オフ nếu chốt đơn qua điện thoại, và bộ số điện thoại dùng để test. Chi tiết ở `04-review-doc-lap.md` §2. + +## 6. Các chỉnh sửa quan trọng sau review + +Review đã giữ/bổ sung các guardrail sau trong proposal: + +- định nghĩa “every call” thành connected call có media/speech và thêm reconciliation report; +- tách dialer disposition khỏi business outcome; +- DNC được xử lý toàn instance, không dùng frequency cap thay thế; +- tăng quota có headroom, không xin đúng 15; +- không khẳng định toll-free campaign hoạt động trước khi test số cụ thể; +- ghi rõ Japanese native PII redaction chưa được support matrix xác nhận; +- không quảng bá sentiment/loudness là nhận dạng cảm xúc chính xác; +- tách transcript availability khỏi transcription accuracy và bổ sung Japanese pilot/custom vocabulary; +- estimate bao gồm PM, UAT, training và production pilot; +- chỉ dùng predictive sau khi có dữ liệu thật và compliance approval. + +## 7. Gate trước khi gửi báo giá chính thức + +Chỉ chuyển ROM thành quotation sau khi có các quyết định sau: + +- **khách chọn Phương án A hay B** (hiển thị フリーダイヤル khi gọi ra, hay tự động quay số theo danh sách); +- số điện thoại: loại số, tồn kho `+81 3`, hồ sơ pháp nhân và cửa sổ port đã chốt được chưa; +- peak volume/AHT/answer rate để sizing quota; +- CSV/CRM sample và data owner; +- outcome/DNC/callback workflow; +- định nghĩa acceptance cho sentiment/tone; +- retention, recording notice, PII/payment và legal approval; +- SSO/environments/security standard; +- KPI dashboard và integration cụ thể. + +Nếu khách chưa trả lời, dùng MVP Phương án A **68 PD baseline** (range 57–80), trình bày kèm Phương án B **75–110 PD** như một lựa chọn riêng, và luôn đưa range cùng danh sách loại trừ thay vì một con số fixed duy nhất. diff --git a/04-review-doc-lap.md b/04-review-doc-lap.md new file mode 100644 index 0000000..a417453 --- /dev/null +++ b/04-review-doc-lap.md @@ -0,0 +1,290 @@ +# Review độc lập bộ tài liệu Amazon Connect Call Center + +Ngày review: **03/09/2026** +Tài liệu được review: `01-nghien-cuu-cong-nghe.md`, `02-giai-phap-va-estimate.md`, `03-review.md`, `README.md` +Phương pháp: đọc chéo 3 tài liệu + kiểm chứng lại nguồn AWS gốc tại thời điểm review (docs AWS, Telecoms Coverage Guide bản 31/08/2026 tải trực tiếp và đọc theo từng ô của bảng). + +--- + +## 0. Kết luận review + +Bộ tài liệu có chất lượng cao: cấu trúc tốt, có acceptance criteria, đã tránh được hầu hết các bẫy quen thuộc (định nghĩa lại "mọi cuộc gọi", tách dialer disposition khỏi business outcome, quota mặc định, không over-promise về emotion AI). Phép cộng estimate kiểm tra lại đều đúng. + +**Nhưng không thể gửi cho khách ở trạng thái hiện tại**, vì một kết luận nền tảng bị sai và nó làm hỏng kiến trúc MVP: + +> Số **0120/0800 (フリーダイヤル) của Nhật KHÔNG dùng được làm số phát cho Amazon Connect Outbound Campaigns.** +> Chỉ DID Nhật (`+81 3`, `+81 6`, `+81 50`) mới được hỗ trợ outbound campaign từ `ap-northeast-1`. + +Nghĩa là hai yêu cầu gốc của khách — *「リストをもとに発信できるシステム(BlueBeanのようなイメージ)」* và *「同じフリーダイヤルで全員が発信できる」* — **không thể đồng thời thỏa mãn bằng tính năng native của Amazon Connect**. Đây là quyết định phải đưa cho khách chốt, không phải chi tiết kỹ thuật để "xác nhận với AWS Support sau". + +Ngoài ra có 1 lỗi kỹ thuật khác (custom caller ID), 10 thiếu sót về phạm vi/nghiệp vụ, và 7 vấn đề trong estimate. Chi tiết bên dưới. + +--- + +## 1. Lỗi chặn (blocker) — phải sửa trước khi gửi khách + +### 1.1 [BLOCKER] Toll-free Nhật không dùng được cho Outbound Campaigns + +**Tài liệu hiện đang viết gì** + +- `01` §4: *"Bản Amazon Connect Telecoms Coverage Guide, cập nhật 31/08/2026, đánh dấu toll-free Nhật có `National Outbound = supported`; Tokyo là outbound campaign region cho Nhật."* +- `README`: *"Số 0120/0800 dùng chung làm caller ID outbound nội địa về nguyên tắc được bảng coverage hỗ trợ."* +- `03` §2: xếp yêu cầu này là **"Đủ nhưng có dependency"**. + +**Thực tế trong đúng bản coverage guide đó** + +Bảng có 9 cột: `Number availability | National Outbound | International Outbound | Porting Available | Multi-Carrier | Custom Caller ID | Region Availability | Outbound Campaign Regions | Status`. +Khối Japan gồm 4 hàng (ảnh chụp lưu tại `evidence/japan-telecoms-coverage-2026-08-31.png`): + +| Service Type | National Outbound | Intl Outbound | Porting | Custom Caller ID | Region Availability | **Outbound Campaign Regions** | +|---|:--:|:--:|:--:|:--:|---|:--:| +| DID `+81 3` / `+81 6` | ✔ | ✔ | ✔ (hạn chế, footnote 2) | ✘ | ap-northeast-1 | **ap-northeast-1** | +| DID `+81 50` | ✔ | ✔ | ✘ | ✘ | All commercial regions | **ap-northeast-1** | +| **Toll-free `+81 120` / `+81 800`** | ✔ | ✘ | ✔ | ✘ | All commercial regions | **–** | +| UIFN | ✘ | ✘ | ✔ | ✘ | All commercial regions | **–** | + +Footnote (2): *"Local Numbers and Porting in Japan is only possible on specific numbers"*. + +Cách đọc bảng đã được đối chiếu với các nước khác để chắc chắn không nhầm ô gộp: Hàn Quốc (DID → `ap-northeast-2`, Toll-free → `–`), Úc (DID → `ap-southeast-2`, Toll-free/UIFN → `–`), Ý/Áo (Toll-free có National Outbound ✔ nhưng campaign `–`). Mỹ là ngoại lệ duy nhất trong nhóm này: cả DID lẫn Toll-free đều campaign-capable. **Nhật theo mẫu chung, không theo ngoại lệ Mỹ.** + +**Diễn giải đúng** + +- Toll-free Nhật `National Outbound = ✔` chỉ có nghĩa: **gọi ra thủ công** (agent bấm gọi / API `StartOutboundVoiceContact`) với caller ID là 0120 thì được hỗ trợ và CLI được đảm bảo hiển thị. +- Nhưng **Outbound Campaigns không nhận số toll-free Nhật làm source number**. Toàn bộ phần "BlueBean-like": Guided Campaign Builder, preview/progressive/predictive, AMD, retry theo disposition, communication limits, campaign schedule — đều đi kèm campaign và do đó đi kèm DID. + +**Hệ quả dây chuyền — AMD cũng mất theo** + +Đã kiểm tra thêm block `Check call progress` (AMD): block này **chỉ hoạt động cho 2 loại cuộc gọi**: *Outbound campaigns* và *Customer-first callbacks*. Mọi loại khác rơi vào nhánh `Error`. Vì vậy nếu tự xây dialer bằng `StartOutboundVoiceContact` để giữ caller ID 0120 thì **không có AMD native** — với outbound sales tiếng Nhật (留守番電話, "おかけになった電話番号は…", "電源が入っていない") đây là mất mát lớn về năng suất. + +**Ba phương án để trình khách** + +| | Phương án A (khuyến nghị) | Phương án B | Phương án B' (cần PoC) | +|---|---|---|---| +| Số phát ra | DID `+81 3` (hoặc `+81 50`) | Toll-free 0120 | Toll-free 0120 | +| Số nhận vào | 0120 (claim/port vào Connect) | 0120 | 0120 | +| Cơ chế quay số | Outbound Campaigns native | Tự xây dialer trên `StartOutboundVoiceContact` | Customer-first callback + `Check call progress` | +| AMD | Có (native) | **Không** | Có, **nếu** PoC xác nhận callback dùng caller ID của queue và AMD chạy đúng | +| Retry/schedule/frequency cap | Có (native) | Phải tự xây | Phải tự xây | +| Rủi ro | Thấp | Cao | Cao, chưa có tài liệu AWS khẳng định | +| Chênh lệch effort so với A | – | **+18–30 PD** | **+12–20 PD + 5–8 PD PoC** | + +Khuyến nghị: chào **phương án A**, giữ 0120 cho inbound và cho nhận diện thương hiệu, và nói rõ với khách rằng "cùng một số cho tất cả agent" vẫn đạt được (một DID dùng chung), chỉ là số đó không phải フリーダイヤル. + +**Lưu ý khi chọn DID cho phương án A** + +- `+81 3` / `+81 6` (số địa lý): tỷ lệ bắt máy tốt nhất, **nhưng** hồ sơ bắt buộc phải chứng minh địa chỉ doanh nghiệp **thuộc đúng vùng của area code**, và footnote (2) cảnh báo chỉ một số dải số nhất định là khả dụng → phải hỏi AWS về tồn kho số trước khi cam kết. +- `+81 50` (IP phone): claim dễ hơn, mọi region, **nhưng** người tiêu dùng Nhật có xu hướng không bắt máy số 050 và nhiều app chặn cuộc gọi gắn cờ mạnh với dải này → ảnh hưởng trực tiếp KPI connect rate của một call center bán hàng. + +### 1.2 [Lỗi kỹ thuật] Custom Caller ID không khả dụng tại Nhật + +`01` §4 viết: *"số phải được claim/port vào Connect **hoặc** được AWS xác minh quyền sở hữu và bật custom caller ID"*. + +Sai với Nhật. Coverage guide: **Custom Caller ID = ✘ cho cả 4 loại số Nhật** (DID 03/06, DID 050, Toll-free, UIFN). Không có đường "giữ số ở carrier hiện tại, chỉ chứng minh sở hữu rồi hiển thị". Số 0120 hiện có của khách (nếu có) **bắt buộc phải port vào Amazon Connect** mới dùng được — kéo theo rủi ro gián đoạn nghiệp vụ inbound đang chạy trên số đó. + +### 1.3 [Rủi ro lịch] Cửa sổ porting Nhật là cố định, và tăng quota mất tới 3 tuần + +Chưa tài liệu nào nêu các con số này, nhưng chúng quyết định trực tiếp việc có kịp 「10月後半か11月上旬」 hay không: + +| Yếu tố | Thực tế theo tài liệu AWS | Ảnh hưởng | +|---|---|---| +| Cửa sổ port số Nhật (cả toll-free lẫn 03/06) | **Thường là ngày 1 và 15 của tháng KẾ TIẾP** | Hồ sơ nộp trong tháng 9 → sớm nhất port được 01/10 hoặc 15/10; trượt một nhịp là sang 01/11 | +| Hồ sơ claim số Nhật | 3 loại: giấy đăng ký DN (cấp trong 6 tháng), ID/hộ chiếu người đại diện có tên trong đăng ký DN, chứng minh địa chỉ DN (cấp trong 6 tháng) | Phải yêu cầu khách chuẩn bị **ngay tuần 1**, không phải sau khi ký hợp đồng | +| Địa chỉ cho số 03/06 | Phải thuộc đúng thành phố của area code | Nếu văn phòng chưa mở/chưa đăng ký → không claim được số Tokyo | +| Tăng quota | AWS: yêu cầu nhỏ vài giờ, **yêu cầu lớn tới 3 tuần**; phải tạo instance trước | Phải mở case trong tuần đầu | +| Instances per Region | Mặc định **2** | Non-prod + prod là vừa hết, không còn chỗ cho sandbox → nên xin tăng sớm | +| Phone numbers per instance | Mặc định **5** | Đủ cho MVP nhưng cần biết trước khi test nhiều số | + +Gantt trong `02` §11 đang để "Number/quota support cases: 28d" như một thanh liên tục. Nên thay bằng các **mốc cứng** (ngày nộp hồ sơ → cửa sổ port 1/15 → ngày test carrier) và ghi rõ đây là dependency nằm ngoài tầm kiểm soát của đội dự án. + +--- + +## 2. Thiếu sót về phạm vi và nghiệp vụ + +### 2.1 Inbound không thể là "add-on tùy chọn" + +Khi 15 agent gọi ra bằng cùng một số, khách hàng Nhật **sẽ gọi lại vào số đó** — đây là hành vi mặc định, không phải trường hợp hiếm. Nếu số đó không có gì trả lời (hoặc tệ hơn: đổ chuông vô tận), thì: +- mất lead đã quan tâm; +- gây khiếu nại, và với 特商法 thì việc không liên lạc lại được là điểm yếu khi bị hỏi; +- nếu là 0120 thì mỗi cuộc gọi lại còn tốn cước của chính khách hàng doanh nghiệp. + +→ Đề nghị chuyển **I01–I04 (5–7 PD) từ add-on thành must-have của MVP**, ít nhất ở mức: giờ làm việc + guidance + hàng đợi tối giản + voicemail/announcement ngoài giờ + ghi âm/analytics giống outbound. + +### 2.2 Thiếu monitor / whisper / barge cho supervisor + +Danh sách must-have `02` §2.1 không có nghe lén (listen-in), nhắc riêng cho agent (whisper) và chen ngang (barge). Với call center outbound sales mới thành lập, 10–15 agent mới tuyển, đây là công cụ đào tạo và kiểm soát chất lượng cơ bản mà supervisor sẽ hỏi ngay ngày đầu. Native của Connect có, nhưng phải cấu hình security profile và phải xử lý mặt pháp lý/thông báo. **Thêm vào MVP, ~1 PD.** + +### 2.3 Năng suất progressive 1:1 có thể không đạt kỳ vọng "BlueBean" + +`01` §3.2 khuyến nghị progressive cho MVP và đẩy predictive sang Full. Về mặt tuân thủ và rủi ro thì đúng, nhưng về kỳ vọng kinh doanh thì nguy hiểm: progressive là **1 agent rảnh : 1 cuộc gọi**. Với cold call D2C, phần lớn thời gian agent sẽ ngồi chờ đổ chuông/không bắt máy. Khách đang so sánh với BlueBean, nơi predictive là mặc định. + +→ Phải chốt **KPI 件数/人/日 ngay ở discovery**. Nếu khách cần volume, F01 (predictive, 5–8 PD) phải nằm trong MVP hoặc phase 2 rất sớm, kèm sizing lại quota và kiểm soát abandonment. Đây là rủi ro "nghiệm thu kỹ thuật đạt nhưng khách thấy hệ thống chậm hơn kỳ vọng". + +### 2.4 AMD tiếng Nhật chưa có trong test plan + +`Check call progress` được huấn luyện chủ yếu trên thị trường nói tiếng Anh. Môi trường Nhật có các mẫu đặc thù: 留守番電話サービス, thông báo của carrier ("おかけになった電話番号は現在使われておりません", "電波の届かない場所にいるか、電源が入っていない"), và 転送電話. Sai AMD làm mất lead (đánh nhầm thành voicemail) hoặc lãng phí agent. +→ Thêm vào **M11** một hạng mục đo AMD trên bộ mẫu thật (landline/mobile/số sai/máy trả lời) và đưa ngưỡng vào acceptance. + +### 2.5 Rủi ro số bị gắn nhãn 迷惑電話 + +Gọi ra volume cao liên tục từ **một** số duy nhất là kịch bản kinh điển dẫn đến bị các app chặn cuộc gọi (電話帳ナビ, Whoscall…) và cơ chế lọc của carrier gắn nhãn "営業電話/迷惑電話". Connect rate có thể tụt dần theo tuần mà không có lỗi kỹ thuật nào. Yêu cầu "cùng một số cho tất cả" làm rủi ro này tập trung tối đa. + +→ Không có cách khắc phục kỹ thuật thuần túy. Cần: đưa vào mục rủi ro, thống nhất theo dõi connect rate theo ngày như một chỉ số cảnh báo sớm, đăng ký thông tin doanh nghiệp cho số gọi ra, và chuẩn bị sẵn phương án nhiều số (khách phải hiểu rằng nếu chấp nhận nhiều số thì phải nới yêu cầu "cùng một số"). + +### 2.6 Thiếu 書面交付義務 và クーリング・オフ của 電話勧誘販売 + +`01` §11 đã nêu 氏名等の明示 và 再勧誘の禁止 — tốt. Nhưng còn thiếu phần có ảnh hưởng trực tiếp đến hệ thống: + +- Nếu **chốt hợp đồng ngay trên điện thoại**, 電話勧誘販売 theo 特商法 phát sinh **nghĩa vụ giao 契約書面** và **quyền クーリング・オフ 8 ngày** kể từ ngày nhận văn bản. +- Hệ quả hệ thống: phải lưu mốc thời gian gửi/nhận văn bản, trạng thái trong thời hạn cooling-off, và cơ chế hủy đơn — cùng với chính sách không tiếp tục chào bán trong giai đoạn đó. + +Đây là D2C bán hàng qua điện thoại nên khả năng phát sinh rất cao. Hiện **không có** trong feature list, data model (`BusinessOutcome` chỉ có outcomeCode/callbackAt/DNC) lẫn estimate. +→ Phải hỏi khách (câu hỏi mới, xem §5) và nếu có thì bổ sung workstream riêng. Đây không phải tư vấn pháp lý; cần legal Nhật của khách xác nhận. + +### 2.7 Không có con số chi phí AWS hàng tháng + +`01` §12 chỉ đưa công thức và nói "không thể tính đáng tin cậy nếu chưa có input". Về mặt kỹ thuật là đúng và trung thực — nhưng về mặt đề xuất thì đây là **thiếu sót lớn nhất**: câu hỏi thứ hai của mọi khách hàng sau "bao nhiêu tiền build" luôn là 「月いくらかかるの?」. Đưa tài liệu không có con số nào sẽ bị đánh giá là chưa làm xong bài. + +→ Bổ sung bảng **3 kịch bản (thấp / trung bình / cao)** với giả định hiện rõ trên mặt bảng: số attempt/ngày, answer rate, AHT, ngày làm việc/tháng, tỷ lệ mobile vs landline. Ghi rõ "giá tại ngày X, phải xác nhận lại khi báo giá" và ghi rõ pricing plan của account (Connect Customer mới vs Customer Basic cũ) là biến số lớn nhất. Một bảng có giả định sai rõ ràng vẫn tốt hơn không có bảng nào, vì nó buộc khách cung cấp số liệu thật. + +### 2.8 Thiếu phần trả lời "vì sao Amazon Connect thay vì BlueBean" + +Khách tự chọn Connect nên tài liệu không bàn — hợp lý về mặt phạm vi, nhưng rủi ro về mặt thương mại. Khi khách thấy 46–63 PD, họ sẽ tự so với BlueBean (SaaS Nhật, tính theo ghế/tháng, lên sóng trong vài ngày, hỗ trợ tiếng Nhật, đã có sẵn list management + predictive + báo cáo). +→ Thêm một mục ngắn, trung thực: Connect thắng ở ghi âm/transcript/sentiment tiếng Nhật gắn liền trong nền tảng, dữ liệu nằm trong AWS account của khách, mở rộng và tích hợp không giới hạn; đổi lại là chi phí xây dựng ban đầu, cần người vận hành AWS, và phần list management phải tự làm. Nêu trước sẽ mạnh hơn nhiều so với bị hỏi ngược. + +### 2.9 Vận hành danh sách hằng ngày chưa được thiết kế + +Customer Profiles + Segments **không phải** là list management theo nghĩa của BlueBean. Những thứ một trưởng nhóm telesales dùng hằng ngày mà Connect không có sẵn khái niệm tương ứng: + +- "list" như một thực thể có tiến độ (đã gọi 320/1000, còn lại chia cho ai); +- phân bổ list theo agent/nhóm; +- sửa nhanh một số điện thoại nhập sai, xóa một lead theo yêu cầu; +- đánh dấu "lần thử thứ 3, chuyển sang danh sách cold". + +`02` đã xếp thin portal vào Standard (S01, 10–14 PD), nhưng MVP lại giả định supervisor thao tác trực tiếp trên AWS admin console — bằng tiếng Nhật, với khái niệm profile/segment/campaign của AWS. **Đây là rủi ro MVP bị nghiệm thu là "không dùng được trên thực tế"**, dù mọi tiêu chí kỹ thuật đều pass. +→ Ít nhất phải: demo console thật cho supervisor trong discovery, chốt quy trình vận hành hằng ngày bằng văn bản, và cảnh báo trước rằng S01 có thể phải kéo lên MVP. + +### 2.10 Thiếu các thủ tục bảo mật/riêng tư mà khách Nhật thường yêu cầu + +- **セキュリティチェックシート** và tài liệu **委託先管理** (khách Nhật gần như luôn yêu cầu khi giao dữ liệu cá nhân cho bên thứ ba) — chưa có trong deliverable. +- Quy trình xử lý yêu cầu **開示・訂正・利用停止・削除** của cá nhân theo 個人情報保護法 — chưa có, dù dự án lưu recording + transcript chứa giọng nói và nội dung hội thoại. +- Hợp đồng/điều khoản về việc xử lý dữ liệu cá nhân giữa khách và bên triển khai. + +--- + +## 3. Vấn đề trong estimate + +**Đã kiểm tra lại toàn bộ phép cộng — tất cả đều đúng** (M01–M14 = 46/63; I = 5/7; S = 47/67 → 93/130; F = 67/100 → 160/230; X = 55/88 → 215/318). Các vấn đề dưới đây là về nội dung, không phải số học. + +### 3.1 [Quan trọng] Bảng FTE mâu thuẫn với số person-day + +`02` §11 liệt kê: PM/BA 0.4–0.6 + architect 0.4–0.6 + backend 1.0 + Connect engineer 0.8–1.0 + QA 0.5 = **3.1–3.7 FTE**, chạy trong **8–10 tuần** → năng lực tương đương **124–185 PD**. +Nhưng MVP chỉ estimate **46–63 PD**. Chênh lệch 2–3 lần. + +Đây là rủi ro thực tế khi lập giá: nếu bộ phận thương mại báo giá theo FTE × tháng thì giá sẽ gấp 2–3 lần con số PD; nếu báo theo PD nhưng thực tế giữ đội hình như bảng thì dự án lỗ. Phải chọn một trong hai: +- giảm bảng FTE xuống mức trung bình ~1.2–1.5 FTE (đúng với 54 PD / 9 tuần), hoặc +- giữ đội hình và ghi rõ đây là **elapsed time có nhiều giai đoạn chờ** (chờ AWS, chờ port số, chờ UAT của khách), đồng thời tách bạch "PD tính tiền" và "thời gian trực chiến". + +### 3.2 Các hạng mục cần bổ sung vào MVP + +| Hạng mục | PD đề xuất | Lý do | +|---|---:|---| +| Inbound tối thiểu (I01–I04 chuyển thành must-have) | +5–7 | §2.1 | +| M04 mở rộng: hồ sơ số Nhật, LOA, theo dõi cửa sổ port, 2 loại số, retest | +2–3 | §1.3; hiện chỉ 2–3 PD là quá mỏng cho quy trình Nhật | +| Monitor / whisper / barge + security profile | +1 | §2.2 | +| AMD tuning + test bộ mẫu tiếng Nhật | +1–2 | §2.4 | +| セキュリティチェックシート / 委託先管理 / quy trình 開示・削除 | +1–2 | §2.10 | +| Tài liệu và đào tạo bằng tiếng Nhật (M13 hiện 3–4 PD cho 3 guide + data dictionary + 3 buổi) | +1–2 | Toàn bộ deliverable là tiếng Nhật cho người dùng cuối Nhật | +| **Tổng bổ sung** | **+11–17** | | + +**MVP đề xuất sau điều chỉnh (phương án A): 57–80 PD, baseline ~68 PD** (so với 46–63/54 hiện tại). + +### 3.3 Thiếu định lượng hypercare và cut-over + +M12 ghi "hypercare ngắn" không có số. Với call center thật, tuần đầu là lúc phát sinh nhiều nhất (audio, headset, số bị chặn, agent thao tác sai). Phải ghi rõ: ví dụ *hypercare 10 ngày làm việc, 0.5 FTE, giờ hành chính JST*, và mọi thứ ngoài đó là hợp đồng bảo trì riêng. + +### 3.4 Thiếu dự phòng cho việc đổi phương án caller ID + +Nếu khách kiên quyết giữ フリーダイヤル (phương án B/B'), scope chênh **+18–30 PD** và rủi ro tăng mạnh. Đề nghị **báo giá 2 phương án riêng biệt** thay vì một con số, và ghi rõ phương án B chỉ được cam kết sau PoC. + +### 3.5 Bộ dữ liệu đo transcript accuracy chưa có chủ + +`02` §5.3 yêu cầu ~20 cuộc gọi được người Nhật đối chiếu. Nhưng bảng vai trò chỉ có "PM/BA bilingual". Cần ghi rõ: ai annotate, mất bao lâu, tính vào PD của bên nào. Nếu là khách làm thì phải nằm trong mục dependency với deadline. + +### 3.6 Kế hoạch test không thể dùng lead thật + +Chưa có tài liệu nào nói về **test data**: gọi thử vào ai. Không được dùng danh sách lead thật để test (vừa là rủi ro pháp lý, vừa đốt lead). Cần một bộ số test do khách cung cấp (nội bộ, đủ phủ NTT landline + docomo/au/SoftBank/rakuten + máy trả lời + số sai), và bộ số đó cũng là ma trận carrier trong acceptance. + +### 3.7 X01 (acoustic emotion) nên tách khỏi bảng tổng + +Việc gộp X01 vào con số "Full core + tất cả option 215–318 PD" tuy có ghi chú nhưng vẫn tạo ấn tượng rằng nhận diện cảm xúc theo giọng nói là một hạng mục có thể mua theo giá. Đề nghị trình bày X01 như một **đề xuất PoC riêng có tiêu chí dừng**, không nằm trong bảng estimate chính. + +--- + +## 4. Các điểm đã kiểm chứng là ĐÚNG (giữ nguyên) + +Để tránh sửa nhầm những phần đang chính xác — các khẳng định sau đã được đối chiếu lại với tài liệu AWS tại ngày review: + +| Khẳng định trong tài liệu | Kết quả kiểm chứng | +|---|---| +| `ja_JP` hỗ trợ post-call analytics, real-time call analytics, post-contact summaries, information extraction, sentiment, pattern match rules, automated performance evaluations | **Đúng**, khớp bảng supported languages | +| `ja_JP` **không** có Redaction | **Đúng** — ô Redaction của ja_JP để trống (chỉ nhóm en/fr/de/it/es/pt có) | +| Concurrent active calls per instance mặc định 10 | **Đúng**, adjustable, resource level | +| Concurrent campaign active calls mặc định 0 | **Đúng**, adjustable | +| Phải tạo instance trước khi xin tăng quota | **Đúng** | +| Instance Tokyo chỉ gọi campaign được tới số Nhật | **Đúng** — "From instances created in Asia Pacific (Tokyo) you can call all phone numbers based in Japan"; không có tổ hợp khác | +| Tokyo hỗ trợ Outbound Campaigns, Customer Profiles, Conversational Analytics (kể cả generative AI features), Agent Workspace, data lake | **Đúng**, đủ cả | +| Voice ID kết thúc hỗ trợ 20/05/2026, không dùng cho thiết kế mới | **Đúng**, có notice chính thức | +| Global Resiliency cặp Tokyo–Osaka | **Đúng**, nhưng nên ghi rõ **Osaka chỉ là region cho bản replica** | +| Sentiment là phân tích nội dung text, không phải nhận diện cảm xúc từ chất giọng | **Đúng**, và cách diễn đạt trong tài liệu là chuẩn mực — giữ nguyên | +| Tách "connected call có media" khỏi "mọi dial attempt" | **Đúng**, và là điểm mạnh nhất của bộ tài liệu | + +Bổ sung 2 con số hữu ích cho phần sizing/monitoring: + +- Post-call analytics job mất khoảng **40% độ dài cuộc gọi**; công thức của AWS: `(phút/cuộc) × 0.4 × (cuộc/giờ) / 60` = số job đồng thời. Quota mặc định 200 → dư sức cho 15 ghế. Con số này cũng biện minh cho SLA kiểm tra artifact 15 phút trong `02` §5.3. +- Real-time analytics đồng thời mặc định 300. + +--- + +## 5. Câu hỏi cần bổ sung vào danh sách chốt với khách + +Thêm vào `02` §14 (đánh số tiếp): + +13. **Nếu buộc phải chọn một: ưu tiên hiển thị フリーダイヤル khi gọi ra, hay ưu tiên tự động quay số theo danh sách?** (Đây là câu hỏi quan trọng nhất của toàn dự án — xem §1.1.) +14. Có chấp nhận hiển thị số **03 (Tokyo)** khi gọi ra và giữ 0120 chỉ để nhận cuộc gọi không? +15. Số 0120 hiện có đang ở carrier nào, hợp đồng ra sao, và có chấp nhận **port hẳn sang AWS** không (không có đường "giữ ở carrier cũ, chỉ hiển thị")? Nghiệp vụ nào đang chạy trên số đó? +16. Doanh nghiệp đã có **đăng ký pháp nhân + địa chỉ tại vùng của area code** muốn dùng chưa? Bộ 3 hồ sơ (đăng ký DN trong 6 tháng, ID người đại diện, chứng minh địa chỉ) khi nào có thể nộp? +17. Mục tiêu **số cuộc gọi/agent/ngày** và **tỷ lệ bắt máy kỳ vọng** là bao nhiêu? (quyết định progressive hay predictive) +18. Có **chốt hợp đồng ngay trên điện thoại** không? Nếu có thì ai lo 契約書面の交付 và quy trình クーリング・オフ 8 ngày? +19. **Ngân sách vận hành/tháng** cho AWS là bao nhiêu? (để chọn giữa bật analytics 100% cuộc gọi hay lấy mẫu) +20. Danh sách **số điện thoại test** (nội bộ, phủ NTT + các nhà mạng di động) do ai cung cấp và khi nào? +21. Ai là người bấm nút vận hành hằng ngày (import list, tạo campaign)? Người đó có dùng được **AWS console tiếng Nhật** không, hay bắt buộc phải có portal riêng? + +--- + +## 6. Việc cần làm ngay + +Theo thứ tự ưu tiên: + +1. **Sửa kết luận về 0120 trong `01` §4, `02` §3/§5.1 và `README`.** Đây là sai sót có thể dẫn đến cam kết một kiến trúc không chạy được. +2. **Mở AWS Support case ngay** với 3 câu hỏi cụ thể, bằng văn bản, trước khi báo giá: + - Số toll-free Nhật có thể dùng làm source number cho Outbound Campaigns không? (dự kiến: không) + - Tồn kho số `+81 3` khả dụng cho campaign tại `ap-northeast-1`, và điều kiện footnote (2)? + - Customer-first callback có dùng được caller ID toll-free và block `Check call progress` không? (phương án B') +3. **Đổi cấu trúc báo giá thành 2 phương án** (A: DID + campaign; B: 0120 + dialer tự xây), không đưa một con số duy nhất. +4. **Bổ sung bảng chi phí AWS/tháng** 3 kịch bản. +5. Đưa **inbound tối thiểu vào MVP**, cập nhật estimate lên **57–80 PD (baseline ~68)** cho phương án A. +6. Thay thanh "Number/quota 28d" trong Gantt bằng các **mốc cứng theo cửa sổ port 1/15**, và nói rõ với khách rằng 「10月後半」 chỉ khả thi nếu hồ sơ số được nộp trong tháng 9. +7. Hỏi 9 câu bổ sung ở §5 trước khi chuyển ROM thành quotation. + +--- + +## Phụ lục — nguồn đã kiểm chứng lại tại ngày review + +- Amazon Connect Telecoms Coverage Guide, bản in ngày **31/08/2026** — https://d1v2gagwb6hfe1.cloudfront.net/Amazon_Connect_Telecoms_Coverage.pdf (ảnh khối Japan: `evidence/japan-telecoms-coverage-2026-08-31.png`) +- Region requirements for ordering and porting phone numbers — https://docs.aws.amazon.com/connect/latest/adminguide/phone-number-requirements.html +- Outbound calling restrictions — https://docs.aws.amazon.com/connect/latest/adminguide/outbound-calling-restrictions.html +- Set up outbound campaigns — https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html +- Availability of features by Region (mục Outbound campaigns) — https://docs.aws.amazon.com/connect/latest/adminguide/regions.html +- Check call progress block (AMD) — https://docs.aws.amazon.com/connect/latest/adminguide/check-call-progress.html +- Languages supported by features — https://docs.aws.amazon.com/connect/latest/adminguide/supported-languages.html +- Service quotas — https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-service-limits.html diff --git a/05-kien-truc-va-codebase.md b/05-kien-truc-va-codebase.md new file mode 100644 index 0000000..fc52dba --- /dev/null +++ b/05-kien-truc-va-codebase.md @@ -0,0 +1,1095 @@ +# Kiến trúc hệ thống và cấu trúc codebase + +Ngày lập: 04/09/2026 +Tài liệu bổ sung cho [`02-giai-phap-va-estimate.md`](./02-giai-phap-va-estimate.md). + +> **Tài liệu này trả lời câu hỏi:** "Đồng ý là 15/22 tính năng chỉ cấu hình, 4 tính năng phải tự viết — nhưng cụ thể *hệ thống trông như thế nào*, *code nằm ở đâu*, *file nào làm gì*, và *mỗi tính năng được giải quyết bằng cách nào*?" +> +> Phạm vi: **MVP Phương án A**. Phần Standard/Full và Phương án B nằm ở §14–§15 để thấy codebase sẽ phình ra theo hướng nào. +> +> Tài liệu này là **thiết kế đề xuất**, không phải bản đã kiểm chứng chạy thật. Những chỗ phụ thuộc vào khả năng của AWS mà chưa xác minh trực tiếp trên account đều được đánh dấu **⚠️ cần xác minh ở M02/M03**. + +--- + +## Mục lục + +| § | Nội dung | +|---|---| +| 1 | Nguyên tắc kiến trúc — vì sao codebase phải nhỏ | +| 2 | Bức tranh tổng thể: 5 tầng và ranh giới trách nhiệm | +| 3 | Bốn điểm nối giữa Amazon Connect và code tự viết | +| 4 | Cấu trúc thư mục repository | +| 5 | Lựa chọn công nghệ và lý do | +| 6 | Mô hình dữ liệu DynamoDB | +| 7 | Hợp đồng API nội bộ | +| 8 | Thiết kế chi tiết từng tính năng MVP | +| 9 | Xử lý sự kiện, idempotency và lỗi | +| 10 | Bảo mật và phân quyền trong code | +| 11 | Môi trường, IaC và CI/CD | +| 12 | Chiến lược kiểm thử theo tầng | +| 13 | Giám sát, cảnh báo và runbook | +| 14 | Codebase sẽ thay đổi thế nào ở Standard/Full | +| 15 | Codebase của Phương án B khác gì | +| 16 | Ánh xạ WBS M01–M16 sang thư mục/artifact | +| 17 | Quy ước code | +| 18 | Checklist khởi tạo repo ngày đầu tiên | + +--- + +## 1. Nguyên tắc kiến trúc — vì sao codebase phải nhỏ + +Năm nguyên tắc dưới đây quyết định mọi lựa chọn kỹ thuật còn lại. Khi có tranh cãi trong lúc code, đây là thứ dùng để phân xử. + +| # | Nguyên tắc | Nghĩa cụ thể khi viết code | Hệ quả nếu vi phạm | +|---:|---|---|---| +| 1 | **Native-first** | Trước khi viết một hàm, phải trả lời được: "Connect đã có sẵn cái này chưa?" Nếu có, dùng, kể cả khi giao diện xấu hơn | Mỗi dòng code tự viết là chi phí bảo trì vĩnh viễn, còn tính năng Connect được AWS nâng cấp miễn phí | +| 2 | **Code chỉ nằm ở rìa** | Code tự viết **không** đứng giữa luồng thoại. Nó chỉ *nghe* sự kiện sau khi Connect xong việc, hoặc *được gọi* từ một điểm mở rộng của Connect | Nếu Lambda nằm trên đường đi của cuộc gọi và nó chết, cuộc gọi chết theo | +| 3 | **Connect là nguồn sự thật của cuộc gọi, DynamoDB là nguồn sự thật của nghiệp vụ** | Không bao giờ chép lại số liệu cuộc gọi vào DynamoDB để "cho tiện báo cáo". Chỉ lưu `contactId` để nối | Hai nguồn số liệu lệch nhau là lỗi không thể debug ở call center | +| 4 | **Mọi thứ tự viết phải chịu được chạy lại** | Mọi handler đều idempotent theo một khóa tự nhiên. Sự kiện của AWS có thể đến hai lần, đến muộn, hoặc sai thứ tự | Kết quả cuộc gọi bị ghi đè, khách bị gọi lại sau khi đã nói "đừng gọi nữa" | +| 5 | **Cấu hình là code** | Contact flow, guide, queue, hours of operation đều nằm trong Git dưới dạng file, không phải "đã bấm trên console" | Không có Git thì không rollback được, và không ai biết prod đang chạy cấu hình nào | + +**Hệ quả cho quy mô codebase MVP:** khoảng **8–12 PD code** (§7.1 của `02`) tương đương chừng **7 Lambda function nhỏ, 1 bảng DynamoDB, 1 CLI công cụ và bộ file cấu hình Connect**. Nếu trong lúc làm thấy codebase phình to hơn nhiều so với con số này, đó là tín hiệu đã vi phạm nguyên tắc 1 hoặc 2 — phải dừng lại rà soát, không phải tăng estimate. + +--- + +## 2. Bức tranh tổng thể: 5 tầng và ranh giới trách nhiệm + +### 2.1 Sơ đồ phân tầng + +```mermaid +flowchart TB + subgraph L1["Tầng 1 — Người dùng"] + AG[Agent
trình duyệt Chrome/Edge] + SV[Supervisor] + AD[Admin] + end + + subgraph L2["Tầng 2 — Amazon Connect ⚙️ KHÔNG viết code"] + AWS1[Agent Workspace + CCP
softphone WebRTC] + AWS2[Contact Flows
luồng gọi ra và gọi vào] + AWS3[Outbound Campaigns
quay số, AMD, retry, lịch] + AWS4[Customer Profiles + Segments] + AWS5[Conversational Analytics
transcript, sentiment ja_JP] + AWS6[Dashboard + Contact Search] + end + + subgraph L3["Tầng 3 — Điểm nối 4 cửa"] + G1[Step-by-step Guide
form nhập kết quả] + G2[Invoke Lambda block
trong contact flow] + G3[EventBridge
contact + campaign events] + G4[S3 Event
file CSV, file recording] + end + + subgraph L4["Tầng 4 — Code tự viết 💻 ~8-12 PD"] + F1[disposition-api] + F2[dnc-service] + F3[callback-scheduler] + F4[list-ingest] + F5[contact-event-sink] + F6[recording-audit] + F7[reconciliation] + end + + subgraph L5["Tầng 5 — Lưu trữ và báo cáo"] + DDB[(DynamoDB
cc-core single table)] + S3R[(S3 recordings
+ analytics, KMS)] + S3D[(S3 data
CSV in/out, report)] + ATH[Athena + Connect data lake] + end + + AG --> AWS1 + SV --> AWS6 + AD --> AWS2 + AWS1 --> G1 + AWS2 --> G2 + AWS3 --> AWS2 + AWS4 --> AWS3 + AWS2 --> AWS5 + G1 --> F1 + G2 --> F2 + G3 --> F5 + G3 --> F3 + G4 --> F4 + F1 --> DDB + F2 --> DDB + F2 --> AWS4 + F3 --> DDB + F4 --> AWS4 + F4 --> S3D + F5 --> DDB + F6 --> S3R + F7 --> DDB + F7 --> S3D + AWS5 --> S3R + DDB --> ATH + S3R --> ATH +``` + +### 2.2 Đọc sơ đồ theo một câu + +> **Tầng 2 là sản phẩm mua sẵn, tầng 4 là phần mềm của dự án, tầng 3 là bốn cái cửa duy nhất nối hai bên.** Mọi thiết kế sau này chỉ được đi qua bốn cửa đó. Nếu phát sinh nhu cầu nối theo cách thứ năm, đó là dấu hiệu thiết kế sai. + +### 2.3 Bảng ranh giới trách nhiệm + +| Câu hỏi | Ai trả lời | Ghi chú | +|---|---|---| +| Gọi số nào tiếp theo? | Outbound Campaigns ⚙️ | Không tự viết hàng đợi quay số | +| Có phải người thật bắt máy không? | Block `Check call progress` ⚙️ | Chỉ chạy được với cuộc gọi của campaign — xem `01` §3.2 | +| Cuộc gọi này ghi âm chưa? | Contact flow ⚙️ + S3 | Code chỉ *kiểm tra* file có tồn tại không, không tự ghi âm | +| Khách nói gì? | Conversational Analytics ⚙️ | Code không chạm vào audio | +| Kết quả bán hàng là gì? | **disposition-api 💻** | Connect không có khái niệm này | +| Số này có bị cấm gọi không? | **dnc-service 💻** + lọc segment | Campaign không có blocklist dựng sẵn | +| Đến giờ gọi lại chưa? | **callback-scheduler 💻** | Callback của Connect phục vụ khách gọi vào, không phải lịch hẹn của sales | +| Hôm qua gọi bao nhiêu, thiếu bao nhiêu file? | **reconciliation 💻** | Ghép 4 nguồn dữ liệu | +| Ai được nghe ghi âm? | Security profile của Connect ⚙️ | Code **không** tự làm phân quyền nghe | + +### 2.4 Điều codebase cố tình **không** làm + +Đây là danh sách phải nói rõ trong review nội bộ, vì đây là những chỗ dễ bị "tiện tay viết thêm": + +- **Không** có backend API cho agent nói chuyện trực tiếp. Agent chỉ dùng Agent Workspace. +- **Không** có bản sao dữ liệu cuộc gọi (CDR) trong DynamoDB. Chỉ lưu con trỏ `contactId` + vài trường tối thiểu phục vụ đối soát. +- **Không** có bộ quay số, bộ điều tiết nhịp gọi, bộ retry. Đó là việc của Campaigns. +- **Không** có màn hình web nào ở MVP. Màn hình quản lý riêng là **S01, phase Standard**. +- **Không** đụng vào file audio hay transcript. Che PII là **X02**, workstream riêng. + +--- + +## 3. Bốn điểm nối giữa Amazon Connect và code tự viết + +Toàn bộ tích hợp gói gọn trong 4 cơ chế. Hiểu 4 cái này là hiểu toàn bộ kiến trúc. + +### Cửa 1 — Step-by-step Guide gọi Lambda (đồng bộ, có mặt agent) + +Dùng cho: **ghi kết quả cuộc gọi (F9)**, **bấm nút không gọi nữa (F10)**, **đặt hẹn gọi lại (F11)**. + +```mermaid +sequenceDiagram + participant A as Agent + participant W as Agent Workspace + participant G as Step-by-step Guide + participant L as disposition-api Lambda + participant D as DynamoDB + A->>W: Kết thúc cuộc gọi, vào trạng thái ACW + W->>G: Hiển thị form kết quả + A->>G: Chọn kết quả + ghi chú + giờ hẹn + G->>L: Invoke với contactId và các trường + L->>D: Ghi disposition, DNC hoặc callback + L-->>G: OK hoặc thông báo lỗi tiếng Nhật + G-->>A: Xác nhận đã lưu +``` + +**Ràng buộc kỹ thuật phải tôn trọng khi viết code:** + +| Ràng buộc | Con số | Hệ quả thiết kế | +|---|---|---| +| Timeout của block Invoke Lambda | 8 giây | Handler phải xong trong ~1s; mọi việc nặng đẩy sang async qua EventBridge | +| Kích thước payload trả về | ~32 KB | Không trả danh sách dài về guide | +| Kiểu dữ liệu trả về | Chuỗi phẳng, không lồng nhau | Lambda phải "làm phẳng" object trước khi return — có helper dùng chung trong `services/shared` | +| Lambda phải được associate với instance | Bắt buộc | Khai báo trong `infra`, không bấm tay | + +> **⚠️ Cần xác minh ở M02:** khả năng và giới hạn cụ thể của step-by-step guide khi gọi Lambda trên account của khách (phiên bản Agent Workspace, quyền, cách bind guide vào ACW). Nếu guide không đáp ứng, phương án dự phòng là **Connect Task + form đơn giản**, chi phí tương đương, đã nằm trong range M08. + +### Cửa 2 — Contact flow gọi Lambda (đồng bộ, trong lúc gọi) + +Dùng cho: **kiểm tra DNC ngay trước khi nối agent** (lớp chặn thứ hai), và **lấy dữ liệu screen pop** nếu cần. + +Nguyên tắc bắt buộc: **nhánh `Error` của block Invoke Lambda phải luôn được nối vào đường đi tiếp an toàn**, không được để cuộc gọi rơi. Lambda chết thì cuộc gọi vẫn phải nối được cho agent — trừ đúng một trường hợp: kiểm tra DNC, nơi lỗi được xử lý theo hướng "an toàn là ngắt máy", vì gọi nhầm một số đã cấm là rủi ro pháp lý, còn bỏ lỡ một cuộc gọi thì không. + +### Cửa 3 — EventBridge (bất đồng bộ, sau khi việc đã xong) + +Dùng cho: **đối soát dữ liệu (F21)**, **cảnh báo (F20)**, **kiểm tra thiếu file ghi âm**, **đánh thức lịch gọi lại**. + +| Nguồn sự kiện | Dùng để làm gì | Service tiêu thụ | +|---|---|---| +| Amazon Connect Contact Events | Ghi mốc thời gian cuộc gọi, trạng thái kết thúc | `contact-event-sink` | +| Campaign events / dữ liệu campaign | Đếm số lượt quay số, disposition kỹ thuật | `contact-event-sink`, `reconciliation` | +| Contact Lens rules | Gắn cờ cuộc gọi cần QA, cảnh báo từ khóa | `contact-event-sink` | +| EventBridge Scheduler theo giờ | Chạy đối soát ngày, quét lịch gọi lại đến hạn | `reconciliation`, `callback-scheduler` | + +> **⚠️ Cần xác minh ở M02/M03:** danh sách trường chính xác của từng loại event, và loại nào bắn qua EventBridge, loại nào chỉ có trong data lake. Đây là việc bắt buộc phải làm sớm vì nó quyết định `reconciliation` lấy số liệu từ đâu. + +### Cửa 4 — S3 event (bất đồng bộ, theo file) + +Dùng cho: **nạp danh sách khách hàng (F2)**, **kiểm tra file ghi âm và file phân tích (F20)**. + +``` +s3://cc-data-/inbound/lists//.csv → kích hoạt list-ingest +s3://cc-data-/outbound/reports//... → báo cáo dòng lỗi trả cho quản lý +s3://cc-recordings-/connect//CallRecordings/... → do Connect ghi, code chỉ đọc metadata +``` + +--- + +## 4. Cấu trúc thư mục repository + +Một repo duy nhất (monorepo). Lý do: khối lượng code nhỏ, cấu hình Connect và code phải deploy đồng bộ với nhau, và đội chỉ 2–3 người. + +```text +callcenter-connect/ +├─ README.md # cách chạy, cách deploy, sơ đồ 1 trang +├─ package.json # npm workspaces +├─ tsconfig.base.json +├─ .env.example +│ +├─ infra/ # ⚙️ hạ tầng dạng code — AWS CDK TypeScript +│ ├─ bin/app.ts # điểm vào, chọn env +│ ├─ lib/ +│ │ ├─ stacks/ +│ │ │ ├─ foundation-stack.ts # KMS key, S3 bucket, log group, budget, tag +│ │ │ ├─ connect-core-stack.ts # hours of operation, queue, routing profile, security profile, user +│ │ │ ├─ connect-flows-stack.ts # nạp file trong connect/flows và connect/guides +│ │ │ ├─ data-stack.ts # bảng DynamoDB, Customer Profiles domain +│ │ │ ├─ app-stack.ts # 7 Lambda + EventBridge rule + Scheduler +│ │ │ ├─ analytics-stack.ts # Glue/Athena, job export dài hạn +│ │ │ └─ observability-stack.ts # CloudWatch alarm, dashboard, SNS topic +│ │ ├─ constructs/ +│ │ │ └─ nodejs-function.ts # wrapper chuẩn: runtime, log retention, powertools, tracing +│ │ └─ config/ +│ │ ├─ common.ts # hằng số dùng chung: mã kết quả, khung giờ gọi +│ │ ├─ dev.ts +│ │ └─ prod.ts +│ └─ test/ # snapshot test của CloudFormation template +│ +├─ connect/ # ⚙️ cấu hình Amazon Connect — NGUỒN SỰ THẬT nằm ở đây, không phải trên console +│ ├─ flows/ +│ │ ├─ outbound-campaign.flow.json # luồng cuộc gọi ra: AMD → ghi âm → analytics → queue +│ │ ├─ inbound-main.flow.json # luồng gọi vào trong giờ +│ │ ├─ inbound-afterhours.flow.json # ngoài giờ: thông báo + lời nhắn +│ │ ├─ agent-whisper.flow.json # câu nhắc agent trước khi nối +│ │ └─ error-handler.flow.json # nhánh lỗi dùng chung +│ ├─ guides/ +│ │ └─ disposition-guide.flow.json # form nhập kết quả trên Agent Workspace +│ ├─ rules/ +│ │ ├─ negative-sentiment.rule.json # gắn cờ cuộc cần QA +│ │ └─ forbidden-keyword.rule.json +│ ├─ vocabulary/ +│ │ └─ ja-JP.txt # tên sản phẩm, tên thương hiệu — KHÔNG chứa dữ liệu cá nhân +│ ├─ prompts/ # file âm thanh tiếng Nhật +│ ├─ hours-of-operation.json +│ └─ MANUAL-CHECKLIST.md # ⚠️ những gì KHÔNG tự động hoá được, phải bấm tay +│ +├─ services/ # 💻 toàn bộ code tự viết của MVP +│ ├─ shared/ # thư viện dùng chung +│ │ ├─ src/ +│ │ │ ├─ ddb.ts # client + helper single-table +│ │ │ ├─ logger.ts # log có cấu trúc, TỰ ĐỘNG che số điện thoại +│ │ │ ├─ phone.ts # chuẩn hoá E.164 cho số Nhật +│ │ │ ├─ jst.ts # mọi thứ liên quan giờ Nhật, ngày nghỉ +│ │ │ ├─ dispositions.ts # bộ mã kết quả, nguồn duy nhất +│ │ │ ├─ connect-response.ts # làm phẳng object để trả về contact flow +│ │ │ ├─ idempotency.ts +│ │ │ └─ errors.ts +│ │ └─ test/ +│ ├─ disposition-api/ # F9 — ghi kết quả cuộc gọi +│ ├─ dnc-service/ # F10 — danh sách không gọi +│ ├─ callback-scheduler/ # F11 — hẹn gọi lại +│ ├─ list-ingest/ # F2 — nạp và kiểm tra danh sách CSV +│ ├─ contact-event-sink/ # nền cho F20/F21 — thu sự kiện cuộc gọi +│ ├─ recording-audit/ # F20 — dò cuộc gọi thiếu ghi âm hoặc thiếu text +│ └─ reconciliation/ # F21 — báo cáo đối soát hằng ngày +│ +├─ tools/ +│ ├─ csv-preflight/ # CLI cho quản lý: kiểm tra file TRƯỚC khi tải lên +│ └─ flow-sync/ # kéo flow từ console về file, phục vụ khi buộc phải sửa tay +│ +├─ tests/ +│ ├─ integration/ # chạy thật trên môi trường dev +│ └─ fixtures/ +│ ├─ lists/ # CSV mẫu: sạch, bẩn, trùng, sai định dạng +│ └─ events/ # payload EventBridge mẫu +│ +└─ docs/ + ├─ adr/ # quyết định kiến trúc, mỗi quyết định 1 file + ├─ runbooks/ # mỗi cảnh báo 1 file hướng dẫn xử lý + └─ ja/ # tài liệu bàn giao tiếng Nhật — M13 +``` + +### Cấu trúc bên trong một service (áp dụng cho cả 7) + +```text +services/disposition-api/ +├─ package.json +├─ src/ +│ ├─ handler.ts # điểm vào Lambda — chỉ parse, gọi, format. KHÔNG chứa nghiệp vụ +│ ├─ schema.ts # zod schema cho input/output +│ ├─ service.ts # toàn bộ nghiệp vụ nằm ở đây, không phụ thuộc AWS +│ └─ repository.ts # truy cập DynamoDB +└─ test/ + ├─ service.test.ts # test nghiệp vụ, không cần AWS + └─ handler.test.ts +``` + +Quy tắc: **`service.ts` không được import SDK của AWS.** Nhờ vậy phần nghiệp vụ khó nhất — thứ tự ghi DNC, chống trùng lịch hẹn, quy tắc giờ Nhật — test được bằng unit test chạy trong vài giây, không cần môi trường AWS. Đây là lý do chính khiến M08 (5–7 PD) khả thi. + +--- + +## 5. Lựa chọn công nghệ và lý do + +| Hạng mục | Chọn | Vì sao | Phương án loại bỏ | +|---|---|---|---| +| Ngôn ngữ | **TypeScript** | Payload của Connect là JSON, kiểu dữ liệu khai báo được; đội cloud/backend phổ biến kỹ năng này | Python cũng được, nhưng chia sẻ kiểu dữ liệu với S01 phase sau sẽ mất | +| Runtime | **Node.js 22 trên Lambda** | Khởi động nhanh, đủ cho ràng buộc 8 giây | Container: thừa cho khối lượng này | +| IaC | **AWS CDK** | Sinh được cả tài nguyên Connect lẫn Lambda trong một cây phụ thuộc | Terraform hợp nếu khách đã chuẩn hoá Terraform — hỏi ở câu 20 §13 của `02` | +| Cơ sở dữ liệu | **DynamoDB một bảng** | Truy vấn đều theo khóa đã biết trước; không cần join; tính tiền theo lượt dùng | RDS: thừa, thêm VPC, thêm chi phí cố định | +| Xác thực dữ liệu vào | **zod** | Một schema dùng cho cả validate và sinh kiểu | Viết tay: dễ lệch giữa validate và type | +| Log/metric | **AWS Lambda Powertools** | Có sẵn log có cấu trúc, metric, tracing, idempotency | Tự viết: tốn PD không cần thiết | +| Kiểm thử | **Vitest** + snapshot CDK | Nhanh, đủ dùng | | +| CI/CD | **GitHub Actions** ⚠️ | Cần chốt theo hạ tầng của khách | | + +**Ước lượng khối lượng code MVP:** khoảng **2.500–4.000 dòng TypeScript** kể cả test, cộng khoảng 8 file JSON cấu hình Connect. Con số này để đội tự kiểm chứng estimate M08 khi làm — nếu đến giữa dự án đã vượt 8.000 dòng thì phạm vi đã trôi. + +--- + +## 6. Mô hình dữ liệu DynamoDB + +### 6.1 Vì sao một bảng + +Toàn bộ truy vấn của MVP đều là "tra theo khóa đã biết": theo `contactId`, theo số điện thoại, theo ngày đến hạn. Không có truy vấn tự do. Một bảng `cc-core-` với 2 chỉ mục phụ là đủ, và tránh được việc phải quản lý 6 bảng rời rạc. + +### 6.2 Bảng `cc-core-` + +Khóa chính: `PK` (partition) + `SK` (sort). Hai chỉ mục toàn cục: `GSI1`, `GSI2`. + +| Thực thể | PK | SK | GSI1PK / GSI1SK | Trường chính | TTL | +|---|---|---|---|---|:--:| +| **Hồ sơ khách** | `CUST#` | `PROFILE` | `PHONE#` / `CUST#` | tên, timezone, nguồn đồng ý, thời điểm đồng ý, cờ DNC, nguồn danh sách | — | +| **Mục DNC** | `DNC#` | `ENTRY` | `DNCDATE#` / `` | lý do, `contactId` gốc, người tạo, thời điểm, đã đồng bộ sang Profiles chưa | — | +| **Kết quả cuộc gọi** | `CONTACT#` | `DISPOSITION` | `AGENT#` / `` | mã kết quả, ghi chú, `campaignId`, `externalCustomerId`, người nhập, phiên bản | — | +| **Bản ghi cuộc gọi tối giản** | `CONTACT#` | `META` | `DAY#` / `` | các mốc thời gian, disposition kỹ thuật, `campaignId`, agent, có ghi âm, có transcript | 400 ngày | +| **Lịch gọi lại** | `CB#` | `META` | `DUE#` / `#` | số điện thoại, `externalCustomerId`, giờ hẹn theo JST, trạng thái, agent yêu cầu, `contactId` gốc | — | +| **Khoá chống trùng lịch hẹn** | `CBIDX#` | `SLOT#` | — | `callbackId` đang giữ chỗ | 90 ngày | +| **Đối soát ngày** | `RECON#` | `SUMMARY` | — | đã gọi, kết nối, có ghi âm, có text, đã nhập kết quả, danh sách lệch | — | +| **Nhật ký thao tác** | `AUDIT#` | `#` | `ACTOR#` / `` | hành động, đối tượng, giá trị cũ/mới | 2.555 ngày | +| **Lô nạp danh sách** | `IMPORT#` | `META` | `IMPDATE#` / `` | tên file, tổng dòng, hợp lệ, lỗi, bị loại do DNC, đường dẫn báo cáo | — | + +### 6.3 Các mẫu truy vấn được hỗ trợ + +| Câu hỏi nghiệp vụ | Truy vấn | +|---|---| +| Cuộc gọi này agent nhập kết quả gì? | `get(PK=CONTACT#, SK=DISPOSITION)` | +| Số này có bị cấm gọi không? | `get(PK=DNC#, SK=ENTRY)` | +| Hôm nay có lịch hẹn nào đến hạn? | `query(GSI1, GSI1PK=DUE#)` | +| Agent A hôm nay nhập bao nhiêu kết quả? | `query(GSI1, GSI1PK=AGENT#A, GSI1SK between ...)` | +| Ngày hôm qua có cuộc nào thiếu ghi âm? | `query(GSI1, GSI1PK=DAY#)` rồi lọc | +| Số điện thoại này là khách nào? | `query(GSI1, GSI1PK=PHONE#)` | +| Ai đã bấm "không gọi nữa" cho số này? | `get(PK=DNC#)` + nhật ký | + +### 6.4 Ba quyết định dữ liệu cần giải thích cho khách + +| Quyết định | Vì sao | +|---|---| +| **Không lưu tên và số điện thoại trong bản ghi cuộc gọi tối giản** | Bản ghi này chỉ phục vụ đối soát. Không có dữ liệu cá nhân trong đó thì rủi ro rò rỉ giảm hẳn, và TTL 400 ngày xoá sạch tự động | +| **DNC dùng số điện thoại làm khóa, không dùng mã khách** | Một người có thể xuất hiện nhiều lần trong nhiều danh sách với mã khác nhau. Chặn theo số mới là chặn thật | +| **Kết quả cuộc gọi khóa theo `contactId`, không theo khách** | Một khách gọi 3 lần thì có 3 kết quả, đọc được lịch sử. Nếu khóa theo khách thì lần sau ghi đè lần trước | + +--- + +## 7. Hợp đồng API nội bộ + +Không có API Gateway ở MVP. Lambda được gọi trực tiếp từ Connect. Nhưng vẫn cần hợp đồng viết ra giấy, vì đây là ranh giới giữa hai đội (người cấu hình Connect và người viết code). + +### 7.1 `disposition-api` — được gọi từ Step-by-step Guide + +**Vào:** + +```json +{ + "action": "SAVE_DISPOSITION", + "contactId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", + "agentId": "agent-07", + "externalCustomerId": "CUST-000123", + "phoneNumber": "+81312345678", + "campaignId": "camp-2026-10-a", + "outcome": "CALLBACK", + "note": "資料送付後に再連絡希望", + "callbackAtJst": "2026-10-09T14:00", + "dncReason": null +} +``` + +**Ra — phẳng, mọi giá trị là chuỗi, theo ràng buộc của Connect:** + +```json +{ + "status": "OK", + "dispositionSaved": "true", + "callbackId": "cb-01JB...", + "dncApplied": "false", + "messageJa": "保存しました" +} +``` + +**Bộ mã kết quả** — khai báo một chỗ duy nhất tại `services/shared/src/dispositions.ts`, và mọi nơi khác import từ đó (guide, báo cáo, đối soát): + +| Mã | Tiếng Nhật | Hành động phụ kèm theo | +|---|---|---| +| `SOLD` | 成約 | — | +| `INTERESTED` | 見込みあり | — | +| `CALLBACK` | 再コール希望 | **Bắt buộc** có `callbackAtJst`, tạo lịch hẹn | +| `NOT_INTERESTED` | 興味なし | — | +| `WRONG_NUMBER` | 番号違い | Gắn cờ chất lượng dữ liệu cho lô nạp | +| `DO_NOT_CALL` | 今後連絡不要 | **Bắt buộc** ghi DNC trước khi trả về | + +> Bộ mã này là **kết quả chốt ở M01**, không phải do đội kỹ thuật tự quyết. Trước khi chốt, mọi code dùng danh sách tạm và đánh dấu `TODO(M01)`. + +### 7.2 `dnc-service` — được gọi từ contact flow + +Vào: `{ "phoneNumber": "+81..." }` → Ra: `{ "blocked": "true" | "false" }`. + +Quy tắc bắt buộc: nếu Lambda lỗi hoặc timeout, contact flow đi vào nhánh **kết thúc cuộc gọi**, không nối agent. Đây là ngoại lệ duy nhất của nguyên tắc "lỗi thì vẫn cho cuộc gọi đi tiếp", và lý do đã nêu ở §3 cửa 2. + +### 7.3 Quy ước chung cho mọi handler + +| Quy ước | Nội dung | +|---|---| +| Mọi phản hồi đều có `status` | `OK` / `VALIDATION_ERROR` / `INTERNAL_ERROR` | +| Thông báo cho agent luôn bằng tiếng Nhật | Trường `messageJa`, tra từ bảng thông điệp trong `shared` | +| Không bao giờ ném lỗi ra ngoài handler | Bắt hết, ghi log, trả về mã lỗi có ý nghĩa | +| Mọi ghi dữ liệu đều idempotent | Khóa nêu ở §9.2 | +| Không log số điện thoại đầy đủ | Logger tự che thành `+8131****678` | + +--- + +## 8. Thiết kế chi tiết từng tính năng MVP + +Phần này đi theo đúng thứ tự bảng tính năng ở `02` §2.1. Với mỗi tính năng: **làm bằng cách nào**, **chạm vào file nào**, và **cái gì dễ sai**. + +--- + +### F1 — Tài khoản và phân quyền ⚙️ + +| | | +|---|---| +| **Thực hiện** | Security profile của Connect. Ba nhóm: `Agent`, `Supervisor`, `Admin` | +| **Không viết code** | Đúng vậy — kể cả quyền nghe ghi âm | +| **File** | `infra/lib/stacks/connect-core-stack.ts`, `infra/lib/config/common.ts` | +| **Điểm khó** | Tách bạch ba quyền: xem chi tiết cuộc gọi / nghe ghi âm / tải file về máy. Mặc định gộp chung là sai với yêu cầu "chỉ quản lý mới nghe được" | +| **Nghiệm thu** | Đăng nhập bằng tài khoản agent thật, xác nhận **không** thấy nút nghe ghi âm | + +--- + +### F2 — Nạp danh sách khách hàng ⚙️+💻 + +Đây là tính năng có code, và là chỗ dữ liệu bẩn của khách đi vào hệ thống — nên xử lý kỹ. + +```mermaid +sequenceDiagram + participant M as Quản lý + participant CLI as tools/csv-preflight + participant S3 as S3 inbound + participant LI as list-ingest Lambda + participant DD as DynamoDB + participant CP as Customer Profiles + M->>CLI: Chạy kiểm tra trước trên máy mình + CLI-->>M: Báo lỗi ngay, sửa file trước khi tải lên + M->>S3: Tải file CSV đã sửa + S3->>LI: Sự kiện tạo object + LI->>LI: 1 Kiểm tra header và mã hoá UTF-8 không BOM + LI->>LI: 2 Chuẩn hoá số sang E.164 + LI->>LI: 3 Bỏ trùng trong nội bộ file + LI->>DD: 4 Đối chiếu danh sách DNC + LI->>LI: 5 Kiểm tra trường đồng ý liên hệ + LI->>CP: 6 Ghi file đã làm sạch cho Customer Profiles + LI->>DD: 7 Ghi tổng kết lô nạp + LI->>S3: 8 Ghi báo cáo dòng lỗi kèm lý do + LI-->>M: Thông báo hoàn tất +``` + +**Mẫu CSV bắt buộc** (khớp `01` §3.1): + +```text +external_customer_id,phone_number,full_name,timezone,consent_source,consent_at,do_not_call,campaign_group +``` + +**Bảy luật kiểm tra, mỗi luật một hàm, mỗi hàm một bộ test:** + +| # | Luật | Xử lý khi vi phạm | +|---:|---|---| +| 1 | File là UTF-8 không BOM, có header đúng | Từ chối cả file, báo lỗi rõ | +| 2 | `phone_number` chuyển được sang E.164 Nhật | Loại dòng, ghi lý do `INVALID_PHONE` | +| 3 | `external_customer_id` không rỗng và không trùng trong file | Giữ dòng đầu, loại dòng sau, lý do `DUPLICATE_IN_FILE` | +| 4 | Số không nằm trong DNC | Loại dòng, lý do `IN_DNC_LIST` | +| 5 | `consent_source` và `consent_at` có giá trị | Loại dòng, lý do `NO_CONSENT` — **luật tuân thủ, không được nới** | +| 6 | `consent_at` không ở tương lai, đúng định dạng ngày | Loại dòng, lý do `INVALID_CONSENT_DATE` | +| 7 | `do_not_call` = true thì ghi thẳng vào DNC | Ghi DNC rồi loại dòng, lý do `MARKED_DNC_IN_FILE` | + +**Báo cáo trả về quản lý** — file CSV cùng cấu trúc file gốc, thêm 2 cột `error_code` và `error_message_ja`, để quản lý sửa ngay trên file đó rồi nạp lại. + +**Điểm khó thật sự:** + +- Chuẩn hoá số Nhật: `03-1234-5678`, `0312345678`, `+81 3 1234 5678`, số có ký tự toàn chiều rộng, số di động `090/080/070`. Hàm `phone.ts` cần bộ test ít nhất **30 ca** — đây là chỗ rẻ nhất để phòng lỗi đắt nhất. +- File lớn: giới hạn 1 GB, phải đọc theo dòng, không nạp cả file vào bộ nhớ. Nếu vượt thời gian chạy Lambda thì chuyển sang xử lý theo lô — đã tính trong range M06. +- `tools/csv-preflight` là **thứ tiết kiệm nhiều thời gian nhất cho vận hành**: quản lý phát hiện lỗi trong 5 giây thay vì chờ nạp xong mới biết. + +**File:** `services/list-ingest/`, `services/shared/src/phone.ts`, `tools/csv-preflight/` + +--- + +### F3, F4, F5 — Tạo đợt gọi, tự động quay số, nhận biết máy trả lời ⚙️ + +| | | +|---|---| +| **Thực hiện** | Outbound Campaigns + Guided Campaign Builder. Chế độ mặc định **progressive**, preview cho nhóm lead cần xem trước | +| **Code** | **Không có dòng nào.** Đây là điểm quan trọng nhất của cả kiến trúc | +| **Cấu hình gồm** | Segment nguồn, số gọi ra (DID dùng chung), khung giờ được phép gọi, quy tắc gọi lại theo disposition kỹ thuật, giới hạn số lần liên hệ, ngày nghỉ | +| **AMD** | Bật block `Check call progress` trong `outbound-campaign.flow.json` | +| **File** | `connect/flows/outbound-campaign.flow.json`, cấu hình campaign trong `infra` nếu IaC hỗ trợ, còn lại vào `MANUAL-CHECKLIST.md` | + +**Điểm khó — đã nêu ở `02` §5.4:** AMD được huấn luyện chủ yếu trên thị trường nói tiếng Anh. Với 留守番電話サービス và các thông báo nhà mạng Nhật, tỷ lệ nhận đúng phải **đo bằng bộ mẫu thật** ở M11, và ngưỡng chấp nhận phải đưa vào tiêu chí nghiệm thu **trước** UAT. Đây là việc kiểm thử, không phải việc code. + +> **⚠️ Cần xác minh ở M03:** mức độ CloudFormation/CDK phủ được cấu hình campaign. Phần nào không phủ được thì ghi vào `MANUAL-CHECKLIST.md` kèm ảnh chụp màn hình, để dựng lại được khi có sự cố. + +--- + +### F6, F7 — Cùng một số gọi ra, 15 cuộc đồng thời ⚙️+📄 + +Đây là hai hạng mục **thủ tục là chính, kỹ thuật là phụ**, nhưng lại là rủi ro lớn nhất dự án. + +| | | +|---|---| +| **F6 thực hiện** | Đặt outbound caller ID ở **một** queue dùng chung. Không cho phép mỗi routing profile một số khác nhau | +| **F7 thực hiện** | Xin tăng quota: cuộc gọi đồng thời của instance và của campaign, mục tiêu **25/25** | +| **Code** | Không | +| **File** | `infra/lib/stacks/connect-core-stack.ts` (queue), `docs/runbooks/quota.md` | +| **Việc phải làm sớm nhất** | Tuần 1: mở AWS Support case. Quota mặc định là 10 và **0** — con số 0 nghĩa là campaign hoàn toàn không chạy được cho đến khi được duyệt | +| **Giám sát** | Alarm khi số cuộc đồng thời chạm 80% hạn mức, để biết trước khi nghẽn | + +Một việc kỹ thuật nhỏ nhưng đáng làm: thêm vào dashboard một chỉ số **tỷ lệ bắt máy theo ngày**. Đây là hệ thống cảnh báo sớm duy nhất cho rủi ro số gọi ra bị gắn nhãn 迷惑電話 (`02` §12) — hiện tượng này không sinh ra lỗi kỹ thuật nào, chỉ thấy qua việc tỷ lệ bắt máy tụt dần. + +--- + +### F8 — Màn hình làm việc của agent ⚙️ + +| | | +|---|---| +| **Thực hiện** | Agent Workspace có sẵn: điều khiển cuộc gọi, hồ sơ khách, guide, thời gian nhập kết quả | +| **Code** | Không. **Không xây CCP tuỳ biến ở MVP** | +| **Cấu hình đáng chú ý** | Bật auto-accept và persistent connection để giảm khoảng lặng khi khách bắt máy; ACW đặt vừa đủ để nhập kết quả — **đo thực tế**, không lấy con số 30 giây của AWS làm mặc định | +| **Screen pop** | Dữ liệu khách lấy từ Customer Profiles, đã có sẵn từ khâu nạp danh sách | +| **Kịch bản nói** | Đặt trong guide, sửa được mà không phải deploy code | + +--- + +### F9 — Ghi kết quả cuộc gọi 💻 *(lõi của M08)* + +**Luồng ghi, thứ tự có ý nghĩa:** + +```mermaid +flowchart TD + A[Agent bấm Lưu trên guide] --> B[Lambda nhận, validate bằng zod] + B --> C{"Hợp lệ?"} + C -- Không --> Z[Trả lỗi tiếng Nhật, agent sửa lại] + C -- Có --> D{"outcome = DO_NOT_CALL?"} + D -- Có --> E[Ghi DNC TRƯỚC] + D -- Không --> F + E --> F{"outcome = CALLBACK?"} + F -- Có --> G[Kiểm tra trùng, tạo lịch hẹn] + F -- Không --> H + G --> H[Ghi kết quả cuộc gọi] + H --> I[Ghi nhật ký thao tác] + I --> J[Trả OK kèm thông báo tiếng Nhật] +``` + +**Ba quy tắc khiến thiết kế này khác một CRUD thường:** + +1. **DNC ghi trước kết quả.** Nếu ghi kết quả trước rồi Lambda chết, ta có một cuộc gọi ghi "không gọi nữa" nhưng số vẫn được gọi lại — hỏng đúng cam kết pháp lý. Ngược lại thì tệ nhất là số bị chặn mà thiếu bản ghi kết quả, phát hiện được qua đối soát và sửa được. +2. **Idempotent theo `contactId`.** Agent bấm hai lần, mạng chập chờn, guide gửi lại — đều phải ra cùng một kết quả. Ghi có điều kiện, lần ghi sau tăng `version` và giữ lại giá trị cũ trong nhật ký. +3. **Không tin `agentId` do client gửi.** Lấy từ ngữ cảnh của Connect. ⚠️ Cần xác minh ở M02 trường nào của guide mang thông tin này đáng tin. + +**Ca biên phải có test:** + +| Ca | Kỳ vọng | +|---|---| +| Agent không nhập gì rồi hết thời gian ACW | Có bản ghi `NO_DISPOSITION`, hiện trong đối soát | +| Nhập `CALLBACK` nhưng không có giờ hẹn | Từ chối, báo tiếng Nhật, không lưu gì | +| Giờ hẹn nằm ngoài khung giờ được phép gọi | Từ chối kèm gợi ý khung giờ hợp lệ gần nhất | +| Gửi hai lần cùng `contactId` | Chỉ một bản ghi, `version` = 2 | +| Ghi chú dài 10.000 ký tự | Cắt còn giới hạn đã định, không làm hỏng bản ghi | + +**File:** `services/disposition-api/` + +--- + +### F10 — Danh sách không gọi 💻 *(lõi của M08)* + +Đây là tính năng **được kiểm tra ở ba lớp**, vì đây là chỗ mà sai một lần là mất uy tín với khách hàng cuối và có rủi ro pháp lý. + +```mermaid +flowchart LR + A[Agent bấm không gọi nữa] --> B[Ghi DNC vào DynamoDB
lớp 1: nguồn sự thật] + B --> C[Gắn cờ trên hồ sơ Customer Profiles
lớp 2: lọc khi tạo segment] + D[Nạp danh sách mới] --> E[Đối chiếu DNC
lớp 3: loại trước khi vào campaign] + F[Trước khi nối agent] --> G[Contact flow gọi kiểm tra
lớp 4: chốt chặn cuối] +``` + +| Lớp | Chặn được gì | Vì sao vẫn cần lớp sau | +|---|---|---| +| 1. DynamoDB | Nguồn sự thật, ghi ngay lập tức | Campaign không đọc DynamoDB | +| 2. Cờ trên hồ sơ khách | Segment lọc được khi tạo đợt gọi mới | Đồng bộ có thể trễ hoặc lỗi | +| 3. Lọc lúc nạp danh sách | Chặn số đã cấm quay lại qua file CSV mới | Danh sách đã nạp trước đó vẫn còn trong campaign đang chạy | +| 4. Kiểm tra trong contact flow | Chốt chặn cuối cùng, chặn cả số vừa mới bị cấm | — | + +**Vì sao phải bốn lớp mà không phải một:** như `02` §2.4 đã nêu, Outbound Campaigns **không có blocklist dựng sẵn**. Cách duy nhất là gắn cờ trên hồ sơ rồi lọc segment — mà segment được tính tại thời điểm tạo đợt gọi, nên một số bị cấm lúc 10h sáng vẫn nằm trong đợt gọi đã tạo từ 8h. Lớp 4 là thứ đóng khoảng trống đó. + +**Chi phí của lớp 4:** thêm một lần gọi Lambda trên mỗi cuộc gọi ra. Cần đo độ trễ ở M11; nếu vượt ngưỡng, phương án thay thế là cache trong bộ nhớ Lambda với thời hạn ngắn — nhưng cache thì mất tính tức thời, phải cân nhắc và ghi ADR. + +**Nghiệm thu (`02` §11):** *"100% số được đánh dấu không gọi nữa bị loại trước đợt gọi kế tiếp."* Test tương ứng: đánh dấu 10 số trong lúc campaign đang chạy, xác nhận không số nào được quay. + +**File:** `services/dnc-service/`, dùng chung trong `services/list-ingest/` + +--- + +### F11 — Hẹn gọi lại 💻 *(lõi của M08)* + +| | | +|---|---| +| **Thực hiện** | Bản ghi lịch hẹn trong DynamoDB + EventBridge Scheduler quét theo giờ | +| **Vì sao không dùng callback của Connect** | Cơ chế đó phục vụ khách gọi vào đang chờ máy. Ở đây là lịch hẹn của nhân viên bán hàng, theo giờ Nhật, có chống trùng, có trạng thái, và phải xuất hiện lại trong danh sách gọi | +| **Đến giờ thì làm gì** | Bộ quét gom các lịch đến hạn, sinh danh sách và đưa vào một segment dành riêng cho đợt gọi lại. **Không tự đặt cuộc gọi** — vẫn để campaign quay số, giữ được AMD và mọi quy tắc | + +**Bốn quy tắc nghiệp vụ:** + +| Quy tắc | Cách làm | +|---|---| +| Theo giờ Nhật | Mọi thứ tính bằng `Asia/Tokyo`, lưu cả ISO có múi giờ lẫn khóa ngày JST. `services/shared/src/jst.ts` là nơi duy nhất được phép tính giờ | +| Không trùng | Khóa chống trùng `CBIDX##SLOT#` ghi có điều kiện. Trùng thì trả về lịch đã có, không tạo mới | +| Không rơi ra ngoài khung giờ hợp lệ | Kiểm tra khung giờ gọi và ngày nghỉ ngay lúc tạo, không đợi đến lúc quét | +| Có vòng đời rõ ràng | `SCHEDULED` → `DUE` → `COMPLETED` / `CANCELLED` / `EXPIRED`. Lịch quá hạn không tự biến mất, phải hiện ra trong đối soát | + +**Ca biên:** hẹn vào ngày nghỉ, hẹn vào 23h, hẹn cho số vừa bị đưa vào DNC (phải huỷ lịch), hẹn hai lần cùng khung giờ, lịch đến hạn nhưng campaign đã kết thúc. + +**File:** `services/callback-scheduler/`, `services/shared/src/jst.ts` + +--- + +### F12, F13, F14, F16 — Ghi âm, transcript, sắc thái, tìm kiếm ⚙️ + +| | | +|---|---| +| **Thực hiện** | Block `Set recording and analytics behavior` trong contact flow. Bật ghi âm hai chiều, bật phân tích sau cuộc gọi với `ja_JP` | +| **Code** | Không. Code **không bao giờ** chạm vào audio hay transcript | +| **Lưu trữ** | S3 chặn truy cập công khai, mã hoá SSE-KMS bằng khoá do khách quản lý, vòng đời chuyển sang lớp lưu trữ rẻ rồi xoá theo chính sách | +| **Từ điển riêng** | `connect/vocabulary/ja-JP.txt` — tên sản phẩm, tên thương hiệu. **Tuyệt đối không đưa dữ liệu cá nhân vào đây.** Từ điển mới không sửa được transcript cũ, nên phải nạp trước khi bắt đầu chạy thật | +| **Quy tắc gắn cờ** | `connect/rules/*.json` — kết hợp sắc thái tiêu cực, độ to giọng, số lần nói chen để chọn cuộc cần QA | + +**Ba điều phải nói thẳng với khách, đã có trong `02` §5.3 và §5.6:** + +1. Chỉ cuộc gọi **có người bắt máy và có hội thoại** mới sinh ghi âm và transcript. Máy bận, số sai, không ai nghe thì không có gì để ghi — nhưng vẫn có bản ghi sự kiện. +2. "Có text" khác "text chính xác". Cần bộ khoảng 20 cuộc gọi được người Nhật đối chiếu, thống nhất cách đo và ngưỡng chấp nhận **trước UAT**. +3. Sắc thái là phân tích **nội dung lời nói**, không phải máy đọc cảm xúc từ chất giọng. Dùng để chọn cuộc cho QA, **không** dùng để tự động đánh giá agent. + +--- + +### F15, F17, F18 — Nghe lén/nhắc riêng/chen ngang, dashboard, báo cáo ⚙️ + +Toàn bộ có sẵn. Việc của dự án là **cấu hình quyền đúng người** và **lưu sẵn các báo cáo mà quản lý cần**, rồi đào tạo cách dùng (M13). Không có code. + +Một lưu ý vận hành đáng ghi vào runbook: quản lý sẽ phải thao tác trên màn hình quản trị của AWS bằng tiếng Nhật. `02` §12 xếp đây là rủi ro "MVP bị đánh giá không dùng được trên thực tế". Cách giảm rủi ro rẻ nhất: **demo màn hình thật ngay trong discovery**, trước khi khách ký. + +--- + +### F19 — Nhận cuộc gọi vào ⚙️ + +| | | +|---|---| +| **Thực hiện** | Contact flow riêng cho luồng gọi vào + hours of operation + queue | +| **Trong giờ** | Lời chào tiếng Nhật → nối agent rảnh → nếu không có ai thì thông báo chờ hoặc để lại lời nhắn | +| **Ngoài giờ** | Thông báo giờ làm việc → cho để lại lời nhắn | +| **Ghi âm và phân tích** | Bật giống hệt luồng gọi ra, để đối soát và báo cáo không phải chia hai nhánh | +| **File** | `connect/flows/inbound-main.flow.json`, `connect/flows/inbound-afterhours.flow.json`, `connect/hours-of-operation.json` | + +Tính năng này ở bản 1 là tuỳ chọn, bản 2 đưa vào bắt buộc — vì hiển thị một số chung khi gọi ra thì **chắc chắn** có khách gọi lại. Không làm phần này nghĩa là để khách gọi vào số công ty và nghe tín hiệu bận. + +--- + +### F20 — Cảnh báo và xử lý sự cố ⚙️+💻 + +| Cảnh báo | Phát hiện bằng cách nào | Code | +|---|---|:--:| +| Cuộc gọi có kết nối nhưng sau 15 phút chưa có file ghi âm | `recording-audit` quét bản ghi sự kiện, đối chiếu S3 | 💻 | +| Phân tích hội thoại lỗi | Sự kiện lỗi từ EventBridge | ⚙️ | +| Chạm 80% hạn mức cuộc gọi đồng thời | CloudWatch alarm | ⚙️ | +| Tỷ lệ bắt máy tụt bất thường so với 7 ngày trước | Chỉ số tự tính trong `reconciliation` | 💻 | +| Lambda lỗi hoặc có message vào hàng đợi lỗi | CloudWatch alarm | ⚙️ | +| Campaign dừng ngoài kế hoạch | Sự kiện campaign | ⚙️ | + +**Vì sao ngưỡng 15 phút:** thời gian phân tích một cuộc gọi thường bằng khoảng 40% độ dài cuộc gọi (`02` §5.3), nên 15 phút là dư an toàn cho cuộc gọi thông thường và không sinh cảnh báo giả. + +**Nguyên tắc bắt buộc:** mỗi cảnh báo phải có **một file runbook tương ứng** trong `docs/runbooks/` và **một người chịu trách nhiệm**. Cảnh báo không có runbook thì không được đưa lên production — vì nó sẽ bị bỏ qua và làm mọi người mất niềm tin vào toàn bộ hệ thống cảnh báo. + +**File:** `services/recording-audit/`, `infra/lib/stacks/observability-stack.ts`, `docs/runbooks/` + +--- + +### F21 — Đối soát dữ liệu 💻 + +Tính năng nhỏ nhưng là **thứ chứng minh hệ thống chạy đúng** — và là công cụ đầu tiên được dùng khi có tranh cãi "sao hôm qua thiếu cuộc gọi". + +Bảng đối soát hằng ngày, đúng như `02` §2.1 mô tả: + +```text +Ngày 2026-10-20 +──────────────────────────────────────────────── +Số lượt quay số 1.240 +Kết nối được người thật 312 (25,2%) +Có file ghi âm 310 (99,4%) ⚠️ thiếu 2 +Có bản text 308 (98,7%) ⚠️ thiếu 2 +Agent đã nhập kết quả 305 (97,8%) ⚠️ thiếu 7 +──────────────────────────────────────────────── +Cần xử lý tay: 2 cuộc thiếu ghi âm, 7 cuộc chưa nhập kết quả +``` + +**Bốn nguồn dữ liệu phải ghép lại:** sự kiện cuộc gọi, dữ liệu campaign, danh sách file trong S3, và kết quả nghiệp vụ trong DynamoDB. `contactId` là khóa nối. Đây chính là lý do `02` §2.4 xếp đối soát vào nhóm phải tự viết — không có sẵn chỗ nào ghép bốn thứ này. + +**Chạy khi nào:** một lần mỗi sáng cho dữ liệu ngày hôm trước, qua EventBridge Scheduler. Kết quả ghi vào DynamoDB và xuất CSV vào S3; gửi tóm tắt qua email/Slack ⚠️ (kênh cần chốt với khách). + +**File:** `services/reconciliation/`, `services/contact-event-sink/` + +--- + +### F22 — Hồ sơ bảo mật và quyền riêng tư 📄 + +Không có code. Bộ tài liệu tiếng Nhật: bảng kiểm bảo mật, tài liệu quản lý bên nhận uỷ thác, chính sách thời hạn lưu, quy trình khi cá nhân yêu cầu xem/xoá dữ liệu. Nằm ở `docs/ja/`. + +Việc kỹ thuật duy nhất liên quan: **quy trình xoá dữ liệu của một cá nhân** phải chỉ ra được dữ liệu người đó nằm ở những đâu — hồ sơ khách, kết quả cuộc gọi, lịch hẹn, DNC, ghi âm, transcript. Bảng ở §6.2 chính là câu trả lời cho câu hỏi đó, nên `docs/ja/` phải trỏ về đây. + +> Lưu ý: mục DNC **không được xoá** khi khách yêu cầu xoá dữ liệu — vì xoá nó đi thì khách sẽ bị gọi lại. Đây là điểm cần legal Nhật xác nhận cách xử lý, ghi rõ trong hồ sơ. + +--- + +## 9. Xử lý sự kiện, idempotency và lỗi + +### 9.1 Vì sao phần này quan trọng hơn vẻ ngoài của nó + +Codebase chỉ có ~3.000 dòng, nhưng phần lớn lỗi khó chịu ở một hệ thống như thế này không đến từ logic sai — mà đến từ **sự kiện đến hai lần, đến muộn, hoặc sai thứ tự**. Ba mẫu dưới đây áp dụng cho mọi handler, không có ngoại lệ. + +### 9.2 Khoá idempotency của từng service + +| Service | Khoá | Hành vi khi trùng | +|---|---|---| +| `disposition-api` | `contactId` | Cập nhật, tăng `version`, giữ giá trị cũ trong nhật ký | +| `dnc-service` | Số điện thoại E.164 | Ghi lần đầu thắng; lần sau chỉ bổ sung lý do | +| `callback-scheduler` | `số + khung giờ` | Trả về lịch đã có, không tạo mới | +| `list-ingest` | Mã lô nạp từ đường dẫn file | Chạy lại cùng file không tạo hồ sơ trùng | +| `contact-event-sink` | `contactId + loại sự kiện + thời điểm` | Ghi đè, vô hại | +| `reconciliation` | Ngày | Chạy lại ghi đè kết quả ngày đó | + +### 9.3 Ba chế độ lỗi và cách xử lý + +| Chế độ | Ví dụ | Xử lý | +|---|---|---| +| **Lỗi dữ liệu vào** | Agent gửi giờ hẹn sai định dạng | Trả về ngay kèm thông báo tiếng Nhật. **Không** thử lại, **không** cảnh báo | +| **Lỗi tạm thời** | DynamoDB bị chậm, Lambda bị điều tiết | Thử lại có giãn cách; quá số lần thì đưa vào hàng đợi lỗi + cảnh báo | +| **Lỗi lập trình** | Không đọc được trường của một object | Vào hàng đợi lỗi, cảnh báo ngay, có runbook để phát lại sau khi sửa | + +**Mọi Lambda bất đồng bộ đều có hàng đợi lỗi.** Message trong đó phải phát lại được sau khi sửa code — nghĩa là payload gốc phải được giữ nguyên, không bị biến đổi trước khi lỗi. + +### 9.4 Bảng sự kiện tiêu thụ + +| Sự kiện | Service | Việc làm | +|---|---|---| +| Contact event: cuộc gọi kết nối / kết thúc | `contact-event-sink` | Ghi bản ghi cuộc gọi tối giản | +| Contact Lens: phân tích xong / lỗi | `contact-event-sink` | Cập nhật cờ "có text" | +| Contact Lens rule khớp | `contact-event-sink` | Gắn cờ cuộc cần QA | +| Campaign: bắt đầu / dừng / xong | `contact-event-sink` | Ghi nhận, cảnh báo nếu dừng ngoài kế hoạch | +| S3: có file CSV mới | `list-ingest` | Nạp danh sách | +| Scheduler: mỗi 15 phút | `callback-scheduler` | Quét lịch đến hạn | +| Scheduler: mỗi giờ | `recording-audit` | Dò cuộc gọi thiếu file | +| Scheduler: 06:00 JST | `reconciliation` | Đối soát ngày hôm trước | + +--- + +## 10. Bảo mật và phân quyền trong code + +### 10.1 Nguyên tắc + +| Nguyên tắc | Áp dụng cụ thể | +|---|---| +| Quyền tối thiểu cho từng Lambda | Mỗi service một IAM role riêng. `dnc-service` chỉ đọc và ghi các mục `DNC#`; không role nào được `dynamodb:*` | +| Không có bí mật trong code | Không có khoá cứng trong repo. Tham số cấu hình qua biến môi trường và Parameter Store | +| Mã hoá mọi nơi | S3 và DynamoDB đều dùng khoá KMS do khách quản lý ở production | +| Không có dữ liệu cá nhân trong log | Logger tự che số điện thoại. Cấm log toàn bộ payload. Có test kiểm tra điều này | +| Ghi vết mọi thao tác nhạy cảm | Bản ghi nhật ký cho mỗi lần ghi DNC, sửa kết quả, huỷ lịch hẹn; CloudTrail cho mọi thao tác API | + +### 10.2 Quyền nghe ghi âm — nói rõ vì hay bị hiểu nhầm + +Phân quyền nghe ghi âm **hoàn toàn nằm ở security profile của Connect**, không có dòng code nào tham gia. Code không tạo link tải file, không proxy audio, không kiểm tra quyền. Điều này là cố ý: mọi cơ chế tự viết quanh việc truy cập ghi âm đều là bề mặt tấn công mới và là gánh nặng audit. + +### 10.3 Kiểm tra tự động trong CI + +- Quét bí mật lộ trong commit. +- Kiểm tra IAM policy không có `Action: "*"` hoặc `Resource: "*"` ngoài danh sách ngoại lệ có ghi lý do. +- Kiểm tra bucket S3 đều bật chặn truy cập công khai. +- Test riêng khẳng định logger che số điện thoại. + +--- + +## 11. Môi trường, IaC và CI/CD + +### 11.1 Hai môi trường + +| Môi trường | Instance Connect | Số điện thoại | Dữ liệu | +|---|---|---|---| +| `dev` | Instance riêng | Số test | **Không dùng dữ liệu cá nhân thật** | +| `prod` | Instance production | Số DID chính thức + 0120 | Dữ liệu thật | + +> Hạn mức mặc định là **2 instance mỗi Region** (`02` §5.2) — vừa đủ hai môi trường này, **không còn chỗ cho sandbox**. Nghĩa là mọi thử nghiệm phá phách phải làm trên `dev`, và `dev` phải khôi phục lại được. Đây là lý do cấu hình phải nằm trong Git. + +### 11.2 Cái gì IaC hoá được, cái gì không + +Đây là phần quan trọng nhất của mục này, vì Amazon Connect **không phủ 100%** bằng hạ tầng dạng code. + +| Nhóm | Trạng thái | Cách xử lý | +|---|---|---| +| S3, KMS, DynamoDB, Lambda, EventBridge, CloudWatch | Phủ đủ | CDK | +| Hours of operation, queue, routing profile, security profile, user, contact flow | Phủ được ⚠️ cần xác minh phiên bản | CDK, nội dung flow nạp từ file JSON trong `connect/` | +| Cấu hình campaign, Customer Profiles domain và mapping, quy tắc Contact Lens, từ điển riêng, guide | **Có thể phải làm tay** ⚠️ | Ghi từng bước vào `connect/MANUAL-CHECKLIST.md`, kèm ảnh chụp; định kỳ dùng `tools/flow-sync` kéo về đối chiếu | +| Xin số, xin tăng hạn mức | Không thể tự động | Thủ tục, M04 | + +**Việc bắt buộc ở M03:** xác định chính xác ranh giới này trên account thật, rồi cập nhật lại mục này. Đừng giả định — cứ mỗi hạng mục phải làm tay là một chỗ hệ thống không dựng lại được sau sự cố, và khách cần biết trước. + +### 11.3 Luồng phát hành + +```mermaid +flowchart LR + A[Pull request] --> B[CI: lint, unit test, snapshot IaC, quét bảo mật] + B --> C[Merge vào main] + C --> D[Tự động triển khai lên dev] + D --> E[Test tích hợp trên dev] + E --> F[Phê duyệt tay] + F --> G[Triển khai lên prod] + G --> H[Kiểm tra sau phát hành: gọi thử 1 cuộc] +``` + +**Quy tắc phát hành riêng cho call center:** không phát hành lên production trong giờ làm việc của call center. Cửa sổ phát hành nằm ngoài khung giờ gọi — ghi rõ trong runbook, vì việc cập nhật contact flow có thể ảnh hưởng cuộc gọi đang diễn ra. + +--- + +## 12. Chiến lược kiểm thử theo tầng + +Kiểm thử chiếm ~18% khối lượng MVP (`02` §7.1) — gần bằng phần cấu hình. Bảng này cho biết 18% đó đi vào đâu. + +| Tầng | Kiểm cái gì | Công cụ | Chạy khi nào | +|---|---|---|---| +| **Unit** | Chuẩn hoá số điện thoại, luật kiểm tra CSV, tính giờ Nhật, chống trùng lịch hẹn, thứ tự ghi DNC | Vitest, không cần AWS | Mỗi commit | +| **Snapshot hạ tầng** | Template CloudFormation không thay đổi ngoài ý muốn | CDK assertions | Mỗi commit | +| **Tích hợp** | Lambda thật ghi vào DynamoDB thật trên `dev`; sự kiện EventBridge đi đúng đường | Vitest chạy trên `dev` | Mỗi lần merge | +| **Luồng cuộc gọi** | Gọi thử số test, đi qua AMD, ghi âm, đến đúng queue, guide hiện ra | Thủ công + kịch bản có sẵn | Mỗi lần đổi flow | +| **Đầu-cuối nghiệp vụ** | Nạp CSV → chạy campaign → agent nhận cuộc → nhập kết quả → thấy trong đối soát | Thủ công theo kịch bản | Trước UAT | +| **Tải và đồng thời** | 15 cuộc kết nối đồng thời liên tục 30 phút | Số test + đội thật | M11 | +| **AMD tiếng Nhật** | Bộ mẫu: cố định, di động, số sai, máy trả lời, thông báo nhà mạng | Bộ mẫu thật | M11 | +| **Ma trận nhà mạng** | Hiển thị số đúng trên NTT cố định và các mạng di động | Thủ công | M11 | +| **Độ chính xác text** | ~20 cuộc gọi được người Nhật đối chiếu | Người Nhật đánh giá | Trước UAT | + +**Điểm đáng chú ý:** năm dòng cuối **không phải test phần mềm** — chúng là test hệ thống viễn thông và test chất lượng ngôn ngữ. Đây chính là lý do `02` §7.1 nói "cắt phần kiểm thử là cắt vào chỗ nguy hiểm nhất": rủi ro của dự án này không nằm ở chỗ code có chạy hay không. + +**Dữ liệu test:** `tests/fixtures/lists/` chứa CSV sạch, CSV có số sai định dạng, có dòng trùng, có dòng thiếu thông tin đồng ý, có ký tự toàn chiều rộng, có BOM. Toàn bộ là dữ liệu bịa, **không có số điện thoại thật**. + +--- + +## 13. Giám sát, cảnh báo và runbook + +### 13.1 Dashboard vận hành + +Ba dashboard, ba đối tượng khác nhau: + +| Dashboard | Cho ai | Nội dung | +|---|---|---| +| Thời gian thực của Connect ⚙️ | Trưởng nhóm | Ai đang gọi, ai rảnh, tiến độ đợt gọi | +| Sức khoẻ hệ thống (CloudWatch) | Admin | Số cuộc đồng thời so với hạn mức, lỗi Lambda, độ sâu hàng đợi lỗi, độ trễ | +| Đối soát và chất lượng dữ liệu 💻 | Quản lý + Admin | Bảng đối soát ngày, tỷ lệ bắt máy theo ngày, số cuộc thiếu ghi âm/text | + +### 13.2 Runbook — mỗi cảnh báo một file + +`docs/runbooks/` là điều kiện mở dịch vụ, không phải tài liệu làm cho đẹp. Mỗi file trả lời bốn câu: **triệu chứng gì**, **kiểm tra ở đâu**, **xử lý thế nào**, **khi nào leo thang cho ai**. + +Danh sách tối thiểu: thiếu file ghi âm; phân tích lỗi; chạm trần cuộc gọi đồng thời; Lambda lỗi và hàng đợi lỗi; campaign dừng ngoài kế hoạch; tỷ lệ bắt máy tụt bất thường; nạp danh sách thất bại; khôi phục cấu hình Connect sau khi sửa nhầm. + +`02` §11 yêu cầu **đã diễn tập khôi phục cấu hình** trước khi mở dịch vụ — nghĩa là runbook cuối cùng trong danh sách trên phải được chạy thử thật ít nhất một lần trên `dev`. + +--- + +## 14. Codebase sẽ thay đổi thế nào ở Standard/Full + +Phần này để trả lời câu hỏi "làm MVP thế này thì sau có phải đập đi làm lại không?". + +### 14.1 Standard — thêm một tầng giao diện, không đụng vào tầng dưới + +```text +callcenter-connect/ +├─ apps/ # ← THƯ MỤC MỚI +│ └─ admin-portal/ # S01 — Next.js, tiếng Nhật +│ ├─ app/ +│ ├─ components/ +│ └─ lib/ +├─ services/ +│ ├─ ...7 service của MVP giữ nguyên... +│ ├─ admin-api/ # S01/S02 — API cho portal +│ ├─ crm-connector/ # S03 — đồng bộ hai chiều +│ └─ bi-export/ # S05 — xuất dữ liệu cho dashboard +``` + +| Hạng mục | Ảnh hưởng tới code MVP | +|---|---| +| S01 màn hình quản lý danh sách | **Không đụng.** Portal gọi lại đúng `list-ingest` đã có | +| S02 kết quả và hẹn lại nâng cao | Mở rộng `disposition-api` và `callback-scheduler`, giữ nguyên mô hình dữ liệu | +| S03 tích hợp CRM | Service mới, nghe sự kiện có sẵn | +| S05 dashboard kinh doanh | Đọc thêm, không sửa gì | +| S06 SSO/IaC/CI-CD | Củng cố phần đã có | + +**Đây là lợi ích cụ thể của việc thiết kế theo §1:** vì MVP không có giao diện web nào và mọi nghiệp vụ đã nằm trong Lambda có hợp đồng rõ ràng, S01 chỉ là thêm một tầng gọi vào các API sẵn có. Không có gì phải viết lại. + +**Một cảnh báo phải nói trước với khách** (`02` §12): nếu trong discovery thấy quản lý **không thể** thao tác trên màn hình quản trị AWS bằng tiếng Nhật, thì S01 phải kéo lên MVP, và MVP tăng thêm **10–14 PD**. Quyết định này nên chốt ở M01, không để đến lúc UAT mới phát hiện. + +### 14.2 Full core — phần lớn không phải code + +Như `02` §2.4 đã nêu, tỷ lệ đảo chiều ở Full core: quay số dự đoán, tóm tắt AI, chấm điểm tự động, xếp ca **đều là bật thêm tính năng có sẵn**. Phần code thật sự chỉ có F02 (cảnh báo tức thời), F04 (trợ lý agent, cần kho tri thức), F07 (BI nâng cao) và F08 (SMS/email theo sau). + +### 14.3 X01/X02 — hai thứ **không** nên nằm trong repo này + +`X01` nhận diện cảm xúc theo giọng và `X02` che thông tin cá nhân tiếng Nhật là **pipeline học máy**, có vòng đời hoàn toàn khác: dữ liệu gán nhãn, huấn luyện, đánh giá, giám sát trôi mô hình. Chúng nên nằm ở repo riêng, kết nối qua sự kiện, để không kéo độ phức tạp của MLOps vào một codebase đang cố tình giữ nhỏ. + +--- + +## 15. Codebase của Phương án B khác gì + +Nếu khách bắt buộc gọi ra bằng số 0120, kiến trúc ở §2 thay đổi ở đúng một chỗ — nhưng là chỗ nặng nhất. + +```mermaid +flowchart LR + subgraph A["Phương án A — hiện tại"] + OC[Outbound Campaigns ⚙️
AWS lo hết] + end + subgraph B["Phương án B"] + DS[dialer-service 💻
tự viết và tự bảo trì] + DS1[hàng đợi danh sách] + DS2[điều tiết nhịp gọi] + DS3[quy tắc gọi lại] + DS4[khung giờ và ngày nghỉ] + DS5[giới hạn số lần liên hệ] + DS6[lọc DNC trước khi gọi] + DS --> DS1 & DS2 & DS3 & DS4 & DS5 & DS6 + end +``` + +| Khía cạnh | Phương án A | Phương án B | +|---|---|---| +| Service tự viết | 7 | **8+**, service mới lớn hơn cả 7 cái kia cộng lại | +| Dòng code ước tính | 2.500–4.000 | **8.000–12.000** | +| PD phần code | 8–12 | **26–42** | +| Nhận biết máy trả lời | Có sẵn ⚙️ | **Mất** — block AMD chỉ chạy cho cuộc gọi của campaign và callback kiểu khách được nối trước | +| Ai bảo trì logic quay số | AWS | **Dự án, vĩnh viễn** | +| Bổ sung phải xây | — | Bộ quản lý trạng thái quay số, chống gọi trùng, xử lý agent rảnh/bận, kiểm soát nhịp | + +**Điều đáng nói nhất về mặt kỹ thuật:** Phương án B không chỉ là "thêm 18–30 PD". Nó chuyển dự án từ **cấu hình một sản phẩm có sẵn** sang **xây một sản phẩm**, với toàn bộ hệ quả: nhiều bug hơn, cần nhiều test hơn, cần người hiểu hệ thống trực khi có sự cố, và không được AWS nâng cấp theo thời gian. Vì vậy `02` §9 đề nghị tách B01 thành một hợp đồng PoC nhỏ trước — đề nghị đó là đúng và nên giữ. + +--- + +## 16. Ánh xạ WBS M01–M16 sang thư mục/artifact + +Bảng này để trả lời "hạng mục này rồi sẽ nằm ở đâu trong repo" khi lập kế hoạch và khi nghiệm thu. + +| ID | Hạng mục | PD | Sản phẩm nằm ở đâu | +|---|---|---:|---| +| M01 | Khảo sát nghiệp vụ và tuân thủ | 3–4 | `docs/ja/`, `services/shared/src/dispositions.ts` (bộ mã kết quả), `infra/lib/config/common.ts` (khung giờ gọi) | +| M02 | Thiết kế giải pháp và bảo mật | 2–3 | `docs/adr/`, chính tài liệu này, xác minh các mục ⚠️ | +| M03 | Dựng nền tảng AWS | 4–5 | `infra/lib/stacks/foundation-stack.ts`, `data-stack.ts`, hai môi trường chạy được | +| M04 | Số điện thoại và hạn mức | 4–6 | `docs/runbooks/quota.md`, hồ sơ ngoài repo, ticket AWS | +| M05 | Người dùng và định tuyến | 2–3 | `infra/lib/stacks/connect-core-stack.ts` | +| M06 | Danh sách và đợt gọi | 5–7 | `services/list-ingest/`, `tools/csv-preflight/`, cấu hình campaign + `MANUAL-CHECKLIST.md` | +| M07 | Luồng gọi, ghi âm, phân tích | 4–5 | `connect/flows/`, `connect/vocabulary/`, `connect/rules/` | +| M08 | Kết quả, DNC, hẹn lại | 5–7 | `services/disposition-api/`, `dnc-service/`, `callback-scheduler/`, `connect/guides/` | +| M09 | Công cụ cho quản lý | 3–4 | Cấu hình security profile + báo cáo lưu sẵn, `docs/ja/` | +| M10 | Giám sát và vận hành | 2–3 | `services/recording-audit/`, `observability-stack.ts`, `docs/runbooks/` | +| M11 | Kiểm thử kỹ thuật và tải | 6–9 | `tests/`, báo cáo test AMD và ma trận nhà mạng | +| M12 | UAT và ổn định | 4–5 | Sửa lỗi rải khắp repo, nhật ký hypercare | +| M13 | Tài liệu và đào tạo | 4–6 | `docs/ja/` — sổ tay admin/agent/quản lý, từ điển dữ liệu | +| M14 | Quản lý dự án | 3–4 | Ngoài repo | +| M15 | Nhận cuộc gọi | 5–7 | `connect/flows/inbound-*.json`, `connect/hours-of-operation.json`, `connect/prompts/` | +| M16 | Hồ sơ bảo mật | 1–2 | `docs/ja/security/` | + +**Kiểm tra chéo:** chỉ có **M06, M08, M10** sinh ra code nghiệp vụ đáng kể — khớp đúng với con số 8–12 PD (~15%) ở `02` §7.1. Nếu trong quá trình làm thấy code xuất hiện ở các hạng mục khác, đó là dấu hiệu phạm vi đang trôi và cần đưa ra bàn. + +--- + +## 17. Quy ước code + +| Chủ đề | Quy ước | +|---|---| +| Ngôn ngữ trong code | Tên biến, hàm, comment: **tiếng Anh**. Thông điệp hiện cho người dùng: **tiếng Nhật**, tập trung trong một file thông điệp | +| Múi giờ | Trong code chỉ dùng UTC. Chuyển sang giờ Nhật đúng một chỗ: `shared/src/jst.ts`. **Cấm** tự viết phép cộng 9 tiếng ở nơi khác | +| Số điện thoại | Chỉ tồn tại một dạng trong hệ thống: E.164. Chuẩn hoá ngay tại biên, không chuẩn hoá ở giữa | +| Tiền và tỷ lệ | Không có ở MVP | +| Xử lý lỗi | Không nuốt lỗi im lặng. Mọi `catch` phải ghi log hoặc ném lại | +| Comment | Chỉ giải thích **vì sao**, không mô tả lại code. Ví dụ đúng: `// Ghi DNC trước disposition: nếu lỗi ở giữa, thà thừa chặn còn hơn gọi nhầm` | +| Kiểm tra dữ liệu vào | Mọi biên đều validate bằng zod, kể cả sự kiện từ AWS | +| Commit | Conventional commits, tiếng Anh, có tham chiếu mã hạng mục: `feat(M08): add DNC write-before-disposition ordering` | +| ADR | Mọi quyết định khó đảo ngược ghi một file trong `docs/adr/`. Tối thiểu phải có: chọn CDK, chọn một bảng DynamoDB, thứ tự ghi DNC, bốn lớp chặn DNC | + +--- + +## 18. Checklist khởi tạo repo ngày đầu tiên + +Thứ tự này cố ý — mỗi bước mở đường cho bước sau, và bước 1–2 là hai việc có thời gian chờ dài nhất của cả dự án. + +| # | Việc | Ai | Vì sao trước | +|---:|---|---|---| +| 1 | **Tạo Connect instance trên `dev` và mở AWS Support case xin tăng hạn mức** | Kiến trúc sư | Phải có instance mới xin được quota; duyệt có thể mất tới **3 tuần** | +| 2 | **Gửi khách danh sách 3 loại hồ sơ pháp nhân để xin/chuyển số** | PM/BA | Cửa sổ chuyển số là ngày 1 và 15 tháng kế tiếp; trượt một nhịp là chậm nửa tháng | +| 3 | Khởi tạo repo, workspaces, TypeScript, lint, CI rỗng | Kỹ sư cloud | Nền cho mọi thứ | +| 4 | `services/shared` với `phone.ts` và bộ test 30 ca | Kỹ sư cloud | Được dùng lại ở khắp nơi, và là chỗ dễ sai nhất | +| 5 | `foundation-stack` và `data-stack` lên `dev` | Kỹ sư cloud | Cần có bảng và bucket mới làm được service | +| 6 | Xác minh 5 mục ⚠️ trong tài liệu này, cập nhật lại | Kiến trúc sư | Quyết định cách làm M06 và M08 | +| 7 | `disposition-api` chạy được đầu-cuối với một guide tối giản | Kỹ sư cloud + Connect | Chứng minh **cửa 1** hoạt động — rủi ro kỹ thuật lớn nhất của M08 | +| 8 | Chốt bộ mã kết quả với khách, thay `TODO(M01)` | PM/BA | Chặn `disposition-api`, guide, báo cáo và đối soát | +| 9 | Xin bộ số điện thoại test từ khách | PM/BA | Không có số test thì không test được gì | + +**Ba việc trong tuần 1 mà nếu quên sẽ trả giá bằng lịch, không phải bằng PD:** bước 1, bước 2 và bước 9. + +--- + +## Phụ lục — Đối chiếu nhanh 22 tính năng MVP với nơi thực hiện + +| # | Tính năng | Cách làm | Thực hiện ở đâu | +|---:|---|:--:|---| +| 1 | Tài khoản và phân quyền | ⚙️ | `connect-core-stack.ts` | +| 2 | Nạp danh sách khách hàng | ⚙️+💻 | `services/list-ingest/`, `tools/csv-preflight/` | +| 3 | Tạo đợt gọi | ⚙️ | Campaign config + `MANUAL-CHECKLIST.md` | +| 4 | Tự động quay số | ⚙️ | Campaign config | +| 5 | Nhận biết máy trả lời | ⚙️ | `connect/flows/outbound-campaign.flow.json` | +| 6 | Mọi agent hiện cùng một số | ⚙️+📄 | `connect-core-stack.ts` + thủ tục M04 | +| 7 | 15 cuộc đồng thời | ⚙️+📄 | Thủ tục M04 + alarm | +| 8 | Màn hình làm việc của agent | ⚙️ | Agent Workspace, không code | +| 9 | Ghi kết quả cuộc gọi | 💻 | `services/disposition-api/` + `connect/guides/` | +| 10 | Danh sách không gọi | 💻 | `services/dnc-service/` — 4 lớp chặn | +| 11 | Hẹn gọi lại | 💻 | `services/callback-scheduler/` | +| 12 | Ghi âm | ⚙️ | Contact flow + S3/KMS | +| 13 | Chuyển thành văn bản | ⚙️ | Conversational Analytics `ja_JP` | +| 14 | Phân tích sắc thái | ⚙️ | `connect/rules/` | +| 15 | Nghe lén/nhắc riêng/chen ngang | ⚙️ | Security profile | +| 16 | Tìm lại cuộc gọi | ⚙️ | Contact search | +| 17 | Bảng theo dõi thời gian thực | ⚙️ | Dashboard có sẵn | +| 18 | Báo cáo | ⚙️ | Báo cáo lưu sẵn | +| 19 | Nhận cuộc gọi vào | ⚙️ | `connect/flows/inbound-*.json` | +| 20 | Cảnh báo và xử lý sự cố | ⚙️+💻 | `services/recording-audit/`, `observability-stack.ts`, `docs/runbooks/` | +| 21 | Đối soát dữ liệu | 💻 | `services/reconciliation/`, `services/contact-event-sink/` | +| 22 | Hồ sơ bảo mật | 📄 | `docs/ja/security/` | + +--- + +## Danh sách các mục ⚠️ phải xác minh trước khi chốt thiết kế + +Năm mục dưới đây là **giả định chưa kiểm chứng**. Cả năm đều phải được xác minh trên account thật ở M02/M03, trước khi bắt đầu viết code của M08. + +| # | Giả định | Nếu sai thì sao | Phương án dự phòng | +|---:|---|---|---| +| 1 | Step-by-step guide gọi được Lambda và nhận được phản hồi | Không có form nhập kết quả trên màn hình agent | Dùng Connect Task + form; chi phí tương đương, đã nằm trong range M08 | +| 2 | Contact/campaign event có đủ trường cho đối soát và bắn qua EventBridge | `reconciliation` thiếu dữ liệu | Lấy từ Connect data lake qua Athena, chạy theo lô hằng ngày | +| 3 | CDK/CloudFormation phủ được contact flow, queue, security profile | Nhiều thứ phải làm tay | Mở rộng `MANUAL-CHECKLIST.md`, dùng `tools/flow-sync` đối chiếu định kỳ | +| 4 | Cấu hình campaign và Customer Profiles IaC hoá được | Không dựng lại tự động được sau sự cố | Ghi thủ tục chi tiết + diễn tập khôi phục bằng tay ở M11 | +| 5 | Trường ngữ cảnh của guide đủ tin cậy để xác định agent | Không quy trách nhiệm được ai nhập kết quả | Lấy `agentId` từ contact event bất đồng bộ, đối chiếu sau | + +--- + +*Tài liệu này bổ sung cho `02-giai-phap-va-estimate.md` và không thay đổi bất kỳ con số estimate nào trong đó. Nếu việc xác minh 5 mục ⚠️ ở trên làm thay đổi thiết kế, phải cập nhật cả hai tài liệu.* diff --git a/06-luu-y-gui-khach-hang.md b/06-luu-y-gui-khach-hang.md new file mode 100644 index 0000000..7d180d2 --- /dev/null +++ b/06-luu-y-gui-khach-hang.md @@ -0,0 +1,142 @@ +# Những điều cần thống nhất với khách hàng trước khi chốt phạm vi MVP + +Ngày lập: 04/09/2026 — dùng để mở đầu buổi làm việc với khách +Tài liệu nguồn: [`02-giai-phap-va-estimate.md`](./02-giai-phap-va-estimate.md), [`01-nghien-cuu-cong-nghe.md`](./01-nghien-cuu-cong-nghe.md) + +> **Mục đích:** gom về một chỗ **những gì MVP không đáp ứng được và vì sao**, để khách quyết định trước khi báo giá — thay vì để phát hiện lúc nghiệm thu. +> +> Toàn bộ nội dung dưới đây đã có trong `02`, tài liệu này chỉ tập hợp lại và viết theo hướng đọc được cho khách nghe. + +--- + +## Phần 0 — Một câu hỏi phải trả lời trước mọi việc khác + +> **Nếu buộc phải chọn một: ưu tiên hiển thị số フリーダイヤル khi gọi ra, hay ưu tiên hệ thống tự động quay số theo danh sách?** + +Đây không phải câu hỏi tu từ. Hai yêu cầu 「リストをもとに発信できるシステム」 và 「同じフリーダイヤルで全員が発信できる」 **loại trừ lẫn nhau** trên Amazon Connect. Mọi con số estimate, mọi mốc lịch đều phụ thuộc câu trả lời này. + +| Khách chọn | Kết quả | MVP | +|---|---|---:| +| Ưu tiên tự động quay số (**khuyến nghị**) | Gọi ra bằng một số 03/050 dùng chung, giữ 0120 để nhận cuộc gọi | 57–80 PD | +| Bắt buộc gọi ra bằng 0120 | Phải tự xây bộ quay số, **mất tính năng nhận biết máy trả lời tự động** | 75–110 PD, cần PoC trước | + +--- + +## Phần 1 — Bốn điều MVP không đáp ứng được + +### 1.1 Không thể vừa gọi ra bằng 0120, vừa tự động quay số theo danh sách + +| | | +|---|---| +| **Yêu cầu gốc** | 同じフリーダイヤルで全員が発信できる | +| **Nguyên nhân** | Theo Amazon Connect Telecoms Coverage Guide bản 31/08/2026, số toll-free `+81 120` / `+81 800` của Nhật **không nằm trong danh sách số dùng được cho quay số tự động**. Ngoài ra Nhật **không hỗ trợ custom caller ID**, nên cũng không có cách giữ số ở nhà mạng hiện tại rồi chỉ hiển thị khi gọi ra | +| **Đây là giới hạn của ai** | Của dịch vụ Amazon Connect tại thị trường Nhật, không phải giới hạn thiết kế của dự án. Không có cách nào lập trình để vượt qua | +| **Thay bằng gì** | Một số cố định `+81 3` (Tokyo) hoặc `+81 50` dùng chung cho toàn bộ 15 agent. Số 0120 vẫn giữ, dùng để **nhận** cuộc gọi từ khách gọi lại | +| **Khách mất gì** | Khách hàng cuối nhìn thấy số 03 thay vì 0120 khi được gọi. Số 050 dễ xin hơn nhưng người Nhật ít bắt máy hơn | +| **Nếu vẫn bắt buộc giữ 0120** | Phải tự xây bộ quay số: **+18–30 PD**, và **mất nhận biết máy trả lời tự động** — agent phải tự nghe và tự bỏ qua hộp thư thoại. Phần này phải PoC trước khi báo giá | + +**Bằng chứng:** `evidence/japan-telecoms-coverage-2026-08-31.png` + +--- + +### 1.2 Không có nhận diện cảm xúc theo chất giọng + +| | | +|---|---| +| **Yêu cầu gốc** | 声のトーンや感情の分析 | +| **MVP giao được gì** | Sắc thái tích cực / trung tính / tiêu cực theo từng đoạn và cả cuộc gọi, độ to giọng, khoảng im lặng, số lần nói chen, và luật kết hợp để tự gắn cờ cuộc gọi cần nghe lại | +| **MVP không giao được gì** | Nhãn cảm xúc kiểu 「怒り」「喜び」「悲しみ」 **suy ra từ đặc trưng âm thanh của giọng nói** | +| **Nguyên nhân** | Sắc thái của Amazon Connect được tính từ **nội dung lời nói đã chuyển thành văn bản**, không phải từ chất giọng. Dịch vụ nhận dạng giọng nói Voice ID cũng đã kết thúc hỗ trợ ngày **20/05/2026**, nên không còn nền tảng có sẵn nào cho việc này | +| **Nếu vẫn cần** | Là đề tài R&D machine learning, không phải cấu hình: cần thống nhất bộ nhãn, thu thập và gán nhãn dữ liệu tiếng Nhật có sự đồng ý, huấn luyện và đánh giá. **25–40 PD cho phần production tối thiểu**, chưa gồm chi phí gán nhãn diện rộng và review pháp lý | +| **Đề nghị** | Trình bày như một PoC riêng có tiêu chí dừng, **không** đưa thành một dòng trong bảng giá | + +> **Cách nói cần thống nhất trước khi ký:** không mô tả tính năng này là 「AIが声から感情を正確に読み取る」. Nói đúng là: hệ thống đo sắc thái nội dung, độ to giọng, im lặng và nói chen, dùng để **chọn cuộc gọi cần nghe lại**, không dùng để tự động đánh giá agent. + +--- + +### 1.3 Không tự động che thông tin cá nhân trong ghi âm và văn bản + +| | | +|---|---| +| **Nguyên nhân** | Amazon Connect **chưa hỗ trợ** che tự động thông tin cá nhân cho tiếng Nhật — cột Redaction của `ja_JP` trong bảng ngôn ngữ hiện để trống | +| **Rủi ro** | Nếu agent hoặc khách đọc số thẻ, địa chỉ, thông tin sức khoẻ qua điện thoại, những thông tin đó nằm nguyên trong file ghi âm và bản văn bản | +| **MVP xử lý bằng quy trình, không bằng kỹ thuật** | Không đọc thông tin thanh toán qua điện thoại — dùng link thanh toán hoặc kênh riêng đạt chuẩn. Kèm phân quyền chặt và thời hạn lưu ngắn nhất hợp lệ | +| **Nếu bắt buộc phải che** | Workstream riêng: **18–30 PD**, phải có bộ test đo được độ chính xác theo từng loại thông tin | +| **Việc khách cần làm** | Xác nhận trong kịch bản bán hàng **không có** bước đọc thông tin thanh toán hay dữ liệu nhạy cảm qua điện thoại | + +--- + +### 1.4 Chưa có quy trình 書面交付 và クーリング・オフ + +> **Đây là mục duy nhất trong danh sách này chưa có câu trả lời từ khách, và cũng là mục chưa được tính vào 57–80 PD.** + +| | | +|---|---| +| **Câu hỏi** | Có chốt hợp đồng ngay trên điện thoại không? | +| **Nếu có** | Hoạt động thuộc 電話勧誘販売 theo 特定商取引法, kéo theo nghĩa vụ bắt buộc: giao 契約書面 và quy trình クーリング・オフ 8 ngày | +| **Tình trạng hiện tại** | **Không nằm trong phạm vi MVP và chưa được estimate.** Chỉ cần khách trả lời "có" là phát sinh một hạng mục công việc mới | +| **Cần gì để estimate** | Legal Nhật xác nhận nghĩa vụ cụ thể, rồi mới ước lượng được | + +--- + +## Phần 2 — Ba điều **có** làm được, nhưng phải định nghĩa "đạt" trước khi ký + +Ba mục này không phải điểm thiếu. Nhưng nếu không chốt trước cách đo, chúng sẽ trở thành tranh chấp lúc nghiệm thu. + +| Mục | Vấn đề | Cần chốt gì, chốt khi nào | +|---|---|---| +| **Độ chính xác của bản văn bản** | 「毎回テキスト化」 làm được 100%. Nhưng "**có** văn bản" khác "văn bản **đúng**" — không hệ thống nào đạt 100% chính xác | Lấy khoảng **20 cuộc gọi thật**, người Nhật đối chiếu, hai bên thống nhất cách đo lỗi và ngưỡng chấp nhận — **trước UAT**. Đồng thời nạp trước danh sách tên sản phẩm và thương hiệu vào từ điển riêng | +| **Nhận biết máy trả lời tự động** | Tính năng có sẵn, nhưng được huấn luyện chủ yếu trên thị trường nói tiếng Anh. Môi trường Nhật còn có 留守番電話サービス và các thông báo nhà mạng như 「おかけになった電話番号は現在使われておりません」 | Đo trên bộ mẫu thật do khách cung cấp (cố định, di động, số sai, máy trả lời), đưa ngưỡng vào tiêu chí nghiệm thu | +| **"Mọi cuộc gọi đều có ghi âm"** | Chỉ cuộc gọi **có người bắt máy và có hội thoại** mới sinh file ghi âm. Máy bận, số sai, không ai nghe thì không có gì để ghi | Thống nhất cách diễn đạt: mọi **lần gọi** đều có bản ghi sự kiện và kết quả; ghi âm và văn bản là sản phẩm đi kèm khi có hội thoại. Báo cáo đối soát hằng ngày sẽ thể hiện rõ con số này | + +--- + +## Phần 3 — Một hạn chế về vận hành cần khách xác nhận sớm + +**Ở MVP, người quản lý thao tác hằng ngày trên màn hình quản trị của Amazon Connect** — nạp danh sách, tạo đợt gọi, xem báo cáo. Đây là màn hình của AWS, có tiếng Nhật, nhưng là màn hình dành cho người quản trị hệ thống, không phải màn hình được thiết kế riêng cho nghiệp vụ bán hàng. + +| | | +|---|---| +| **Vì sao MVP làm vậy** | Xây màn hình riêng tốn **10–14 PD** và chỉ nên làm sau khi biết thao tác nào là thường xuyên nhất trong thực tế | +| **Rủi ro nếu không xác nhận trước** | Khách nhận hệ thống rồi mới thấy "không dùng được trên thực tế" | +| **Cách xử lý** | **Demo màn hình thật ngay trong buổi discovery**, trước khi ký. Nếu người vận hành không dùng được, kéo màn hình riêng lên MVP: **+10–14 PD** | + +--- + +## Phần 4 — Những gì nằm ngoài tầm kiểm soát của cả hai bên + +Các mục này **có** giải pháp, nhưng thời gian do bên thứ ba quyết định. Đây là lý do không thể cam kết ngày mở dịch vụ ở thời điểm này. + +| Mục | Ràng buộc | Ảnh hưởng | +|---|---|---| +| Xin và chuyển số điện thoại | Cửa sổ chuyển số của Nhật thường là **ngày 1 và ngày 15 của tháng kế tiếp** | Trượt một nhịp là chậm nửa tháng | +| Hồ sơ pháp nhân | Cần 3 loại: giấy đăng ký doanh nghiệp cấp trong 6 tháng, giấy tờ tuỳ thân người đại diện, giấy tờ địa chỉ cấp trong 6 tháng. Địa chỉ phải **đúng vùng của area code** muốn dùng | Không có hồ sơ thì không mở được thủ tục | +| Tồn kho số `+81 3` | Không phải lúc nào cũng còn số | Có thể phải dùng 050, tỷ lệ bắt máy thấp hơn | +| Duyệt tăng hạn mức của AWS | Mặc định là **10** cuộc gọi đồng thời và **0** cuộc gọi đồng thời cho chiến dịch. Yêu cầu lớn **có thể mất tới 3 tuần** | Chưa duyệt thì không đạt 15 cuộc đồng thời | + +> **Mốc 「10月後半」 chỉ khả thi nếu hồ sơ xin số được nộp trong tháng 9 và số về kịp cửa sổ 15/10.** + +--- + +## Phần 5 — Việc cần khách quyết định hoặc cung cấp + +| # | Việc | Vì sao gấp | +|---:|---|---| +| 1 | **Quyết định Phương án A hay B** (Phần 0) | Chặn toàn bộ báo giá và lịch | +| 2 | Trả lời: có chốt hợp đồng qua điện thoại không? (mục 1.4) | Có thể phát sinh hạng mục mới ngoài estimate | +| 3 | Chuẩn bị 3 loại hồ sơ pháp nhân | Cửa sổ chuyển số là mốc cứng | +| 4 | Xác nhận 0120 hiện có đang ở nhà mạng nào, nghiệp vụ nào đang chạy trên số đó, có chấp nhận chuyển hẳn sang AWS không | Ảnh hưởng kế hoạch cắt chuyển | +| 5 | Xem demo màn hình quản trị và xác nhận dùng được (Phần 3) | Quyết định MVP có cần thêm 10–14 PD hay không | +| 6 | Cung cấp danh sách số điện thoại dùng để test | Không có thì không kiểm thử được | +| 7 | Xác nhận kịch bản bán hàng không đọc thông tin thanh toán qua điện thoại (mục 1.3) | Quyết định có cần workstream che thông tin cá nhân không | +| 8 | Thống nhất định nghĩa "phân tích cảm xúc" theo mục 1.2 | Tránh tranh chấp lúc nghiệm thu | + +--- + +## Tóm tắt một trang cho lãnh đạo + +- Phần lõi tổng đài — tự động quay số theo danh sách, ghi âm, chuyển thành văn bản tiếng Nhật, phân tích, báo cáo, nhận cuộc gọi — **đều đáp ứng được** bằng tính năng có sẵn của Amazon Connect. +- **Một yêu cầu không thể đáp ứng như hình dung ban đầu:** không thể vừa gọi ra bằng số フリーダイヤル vừa tự động quay số theo danh sách. Đây là giới hạn của dịch vụ tại thị trường Nhật. +- **Hai yêu cầu chỉ đáp ứng được ở mức khác với kỳ vọng:** phân tích cảm xúc là phân tích nội dung lời nói chứ không phải chất giọng; che thông tin cá nhân tiếng Nhật chưa được hỗ trợ. +- **Một nghĩa vụ pháp lý chưa được làm rõ:** nếu chốt hợp đồng qua điện thoại thì phát sinh 書面交付 và クーリング・オフ, hiện chưa nằm trong estimate. +- **Ngày mở dịch vụ chưa thể cam kết** cho đến khi AWS xác nhận số điện thoại, quyền gọi ra và hạn mức. diff --git a/Estimate_CallCenter_AmazonConnect_2026-09-03.xlsx b/Estimate_CallCenter_AmazonConnect_2026-09-03.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..82078fc910cfee79d8446a7ac9b247767f3f1921 GIT binary patch literal 34960 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

^d*yu5PWRXR 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 O6$rNin_)+rK|BES&63Cf literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..bbea627 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Bộ tài liệu đề xuất Amazon Connect cho D2C Call Center + +Ngày rà soát: **03/09/2026** (bản sửa lần 2) +Phạm vi: call center tại Nhật, 10–15 agent, chủ yếu outbound sales, có nhận cuộc gọi ở mức cơ bản. + +## Tài liệu + +| File | Nội dung | Dùng khi nào | +|---|---|---| +| [01-nghien-cuu-cong-nghe.md](./01-nghien-cuu-cong-nghe.md) | Kiến thức nền, khả năng và giới hạn thật của Amazon Connect tại Nhật, kèm nguồn AWS gốc | Khi cần tra cứu "cái này có làm được không" | +| [02-giai-phap-va-estimate.md](./02-giai-phap-va-estimate.md) | Danh sách tính năng viết bằng ngôn ngữ nghiệp vụ, kiến trúc, các phương án, WBS và estimate theo person-day | **Tài liệu chính để trao đổi với khách và lập giá** | +| [03-review.md](./03-review.md) | Review nội bộ lần 1 — đã được đánh dấu các điểm bị thay thế | Tham khảo lịch sử quyết định | +| [04-review-doc-lap.md](./04-review-doc-lap.md) | Review độc lập lần 2, có kiểm chứng lại nguồn AWS gốc | Khi cần biết vì sao bản 2 khác bản 1 | +| [05-kien-truc-va-codebase.md](./05-kien-truc-va-codebase.md) | Kiến trúc hệ thống, cấu trúc thư mục code, mô hình dữ liệu và cách giải quyết chi tiết từng tính năng | **Tài liệu cho đội kỹ thuật** — khi bắt đầu triển khai hoặc khi khách hỏi "hệ thống trông như thế nào" | +| [06-luu-y-gui-khach-hang.md](./06-luu-y-gui-khach-hang.md) | Tóm tắt những gì MVP **không** đáp ứng được và nguyên nhân, những gì cần khách quyết định | **Mở đầu buổi làm việc với khách** — đọc trước khi vào bảng tính năng và bảng giá | +| `evidence/` | Ảnh chụp bảng Japan trong Telecoms Coverage Guide 31/08/2026 | Bằng chứng cho kết luận về số điện thoại | + +## Kết luận ngắn + +**Điều quan trọng nhất, cần đưa cho khách quyết định trước mọi việc khác:** + +> Số フリーダイヤル 0120/0800 của Nhật **không dùng được** làm số phát cho tính năng quay số tự động theo danh sách của Amazon Connect. Chỉ số DID (`+81 3`, `+81 6`, `+81 50`) mới dùng được, và chỉ từ region Tokyo. +> +> Nghĩa là hai yêu cầu của khách — 「リストをもとに発信できるシステム」 và 「同じフリーダイヤルで全員が発信できる」 — **không thể đồng thời thỏa mãn** bằng tính năng có sẵn. Nhật cũng **không hỗ trợ custom caller ID**, nên không có đường giữ số ở nhà mạng cũ rồi chỉ hiển thị. + +Các kết luận còn lại: + +- **Phương án A (khuyến nghị):** gọi ra bằng một số DID dùng chung cho cả 15 agent, giữ 0120 để nhận cuộc gọi. **MVP 57–80 PD, baseline 68 PD.** +- **Phương án B** (bắt buộc giữ 0120 để gọi ra): phải tự xây bộ quay số và **mất tính năng nhận biết máy trả lời tự động**. **MVP 75–110 PD**, và chỉ nên báo giá sau PoC. +- Nhận cuộc gọi vào **không còn là tùy chọn**: hiển thị một số chung khi gọi ra thì chắc chắn có khách gọi lại. +- Tiếng Nhật `ja_JP` hỗ trợ đầy đủ chuyển hội thoại thành văn bản, phân tích sau cuộc gọi, phân tích thời gian thực, tóm tắt và sắc thái. **Che thông tin cá nhân tự động thì chưa hỗ trợ.** +- "Cảm xúc" ở mức có sẵn là sắc thái suy ra từ nội dung lời nói, kết hợp độ to giọng, im lặng và nói chen — không phải bộ nhận dạng cảm xúc từ chất giọng. +- Hai hạn mức mặc định gây chặn là số cuộc gọi đồng thời (mặc định 10) và số cuộc gọi đồng thời của chiến dịch (mặc định 0). Phải tạo instance và xin tăng sớm; **yêu cầu lớn có thể mất tới 3 tuần**. +- **Lịch số điện thoại là ràng buộc cứng:** cửa sổ chuyển số của Nhật thường là ngày 1 và ngày 15 của tháng kế tiếp, và hồ sơ pháp nhân phải chuẩn bị từ tuần đầu. Mốc 「10月後半」 chỉ khả thi nếu hồ sơ được nộp trong tháng 9. + +## Cách dùng khi trao đổi với khách hàng + +- Mở đầu bằng `06` — bốn điều MVP không đáp ứng được và **câu hỏi lựa chọn Phương án A hay B**. Mọi con số đều phụ thuộc câu trả lời này (chi tiết ở `02` §13 câu 1–4). +- Dùng bảng tính năng ở `02` §2 để trao đổi — bảng đó cố ý viết bằng ngôn ngữ nghiệp vụ, cột "Hệ thống làm gì" có thể đọc trực tiếp cho khách nghe, và cột "Cách làm" cho biết ngay tính năng nào là **bật sẵn của AWS** (⚙️) và tính năng nào **phải tự viết** (💻). +- Khi cần giải thích **hệ thống được xây thế nào** — sơ đồ tầng, ranh giới giữa phần cấu hình và phần tự viết, cấu trúc repo, mô hình dữ liệu, thiết kế từng tính năng — dùng `05`. +- Khi khách hỏi "tiền đi vào đâu", dùng `02` §2.4 và §7.1: trong MVP chỉ khoảng **15% khối lượng là code tự viết**, tập trung vào bốn chỗ Amazon Connect không có sẵn (ghi kết quả cuộc gọi, danh sách không gọi, hẹn gọi lại, đối soát dữ liệu). +- Dùng bảng truy vết yêu cầu ở `02` §3 để xác nhận phạm vi và cách nghiệm thu. +- Đưa **bảng chi phí vận hành ba kịch bản** ở `01` §12 để khách sửa trực tiếp các giả định — mục đích là lấy được số liệu thật, không phải cam kết chi phí. +- Báo giá **hai phương án tách bạch**, theo cận trên của range, cộng dự phòng thương mại 10% nếu hợp đồng fixed-price. +- Không cam kết ngày mở dịch vụ cho đến khi AWS xác nhận số điện thoại, quyền gọi ra và hạn mức. +- Không mô tả sắc thái và độ to giọng là "AI đọc chính xác cảm xúc qua giọng nói"; phải thống nhất định nghĩa và cách đo trước khi ký. diff --git a/evidence/japan-telecoms-coverage-2026-08-31.png b/evidence/japan-telecoms-coverage-2026-08-31.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1757d0414755c3e480c5225d8ed2eb0a28b379 GIT binary patch literal 252595 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 z92≪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 z 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%0AI2Qx<0z{Dd*Lf_Bp9JY>A6cyreg?AzWe6rpa%dg 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 literal 0 HcmV?d00001