@ngocsangairvds/vsaf 3.0.12 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,669 @@
1
+ # Flow {XX} — {Tên chức năng}
2
+
3
+ > **Template:** SRS Feature-Level v4 | **Cấu trúc:** SRS_Template standard (12 sections: 0–11)
4
+ > **Thay đổi so với v3:**
5
+ > - [v4.1] Cấu trúc 12 sections (0–11): 0 Preamble, 1 Introduction, 2 Business Context, 3 System Overview, 4 Data Model, 5 Functional Requirements, 6 State & Behavioral Models, 7 Business Rules & Validation, 8 NFR, 9 Constraints, 10 RTM, 11 Appendix
6
+ > - [v4.2] Section 3 System Overview tách riêng — High-Level Activity Diagram + Architecture (dời từ cuối tài liệu lên)
7
+ > - [v4.3] Section 4 Data Model gộp Entity tables + ER diagram + Kafka Events + API Endpoints
8
+ > - [v4.4] Section 7 Business Rules & Validation gộp BR table + Validation Rules + Error Codes (section 4 cũ)
9
+ > - [v4.5] Section 11 Appendix chứa Figma Mapping tables + Screen List + Chức năng ảnh hưởng + Gap Analysis
10
+ > - [v4.6] Section 10 RTM bổ sung cột BR + AC + Test Case (từ RTM chuẩn)
11
+ > - [v4.7] Figma Mapping tables dời về Appendix 11.1, UC detail chỉ giữ inline blockquote tham chiếu
12
+
13
+ **Dự án:** {Tên dự án}
14
+ **Trang Confluence gốc:** `{confluence-url}`
15
+ **Người soạn:** BA Team
16
+ **Ngày:** {YYYY-MM-DD}
17
+
18
+ ---
19
+
20
+ ## 0. Preamble
21
+
22
+ ### Thông tin tài liệu
23
+
24
+ | | |
25
+ |---|---|
26
+ | **Tên tài liệu** | SRS Feature-Level — {FR-XX}: {Tên chức năng} |
27
+ | **Phiên bản** | {X.Y} |
28
+ | **Ngày** | {YYYY-MM-DD} |
29
+ | **Tác giả** | BA Team |
30
+ | **Trạng thái** | Draft / In Review / Approved |
31
+
32
+ ### Bảng ghi nhận thay đổi
33
+
34
+ A – Tạo mới, M – Sửa đổi, D – Xóa bỏ
35
+
36
+ | Ngày | Vị trí | A/M/D | Nguồn gốc | Link CR | Mô tả thay đổi | Phiên bản Confluence | Phiên bản mới |
37
+ |---|---|---|---|---|---|---|---|
38
+ | {YYYY-MM-DD} | Toàn bộ | A | {PRD vX / Architecture vX / ...} | — | Tạo mới — SRS Feature-Level cho {FR-XX}: {Tên chức năng}. Bao gồm {N} chức năng con ({FR-XX-01} → {FR-XX-0N}) của {service-name}. | — | 1.0 |
39
+
40
+ ### Bảng phê duyệt
41
+
42
+ | Vai trò | Họ tên | Chữ ký | Ngày |
43
+ |---|---|---|---|
44
+ | BA Lead | | | |
45
+ | Product Owner | | | |
46
+ | Tech Lead | | | |
47
+ | UX Designer | | | |
48
+
49
+ ---
50
+
51
+ ## 1. Introduction
52
+
53
+ ### 1.1 Purpose
54
+
55
+ {Mô tả mục đích tài liệu — đặc tả yêu cầu phần mềm chi tiết cho {FR-XX}: {Tên chức năng} thuộc {Tên dự án}. Phạm vi bao gồm {N} chức năng con ({FR-XX-01} → {FR-XX-0N}) của **{service-name}**.}
56
+
57
+ | | |
58
+ |---|---|
59
+ | **Vấn đề cần giải quyết** | {Mô tả vấn đề nghiệp vụ mà flow này giải quyết.} |
60
+ | **Business Goals & Metrics** | {Metric ID}: {Chỉ số mục tiêu}. Nguồn: {PRD Metrics MX}. |
61
+ | **Loại chức năng** | ☐ Mobile app    ☐ Web app    ☐ Tiến trình    ☐ API |
62
+ | **Đường dẫn chức năng** | {Đường dẫn menu/navigation dẫn đến chức năng.} |
63
+ | **Precondition** | {UC-XX-01}: {Điều kiện tiên quyết}. {UC-XX-02}: {Điều kiện tiên quyết}. |
64
+ | **Post-condition** | {Trạng thái hệ thống sau khi UC hoàn thành thành công. Bao gồm: DB state, events published, session state.} |
65
+ | **Flow liên quan** | Flow {YY} ({Tên}) → **Flow {XX} (này)** → Flow {ZZ} ({Tên}) |
66
+
67
+ ### 1.2 Scope
68
+
69
+ **Phạm vi (In-scope):**
70
+
71
+ | Sub-FR | Chức năng | Phân kỳ |
72
+ |--------|-----------|---------|
73
+ | FR-{XX}-01 | {Tên chức năng} | MVP Bắt buộc / MVP Nên có / Phase 2 |
74
+ | FR-{XX}-02 | {Tên chức năng} | MVP Bắt buộc |
75
+
76
+ **Ngoài phạm vi (Out-of-scope):**
77
+ - {Tính năng A} — {Lý do / Phase kế hoạch}
78
+ - {Tính năng B} — {Lý do}
79
+
80
+ ### 1.3 Definitions & Acronyms
81
+
82
+ | Thuật ngữ / Viết tắt | Giải thích |
83
+ |---|---|
84
+ | NTBH | Nền tảng Bảo hiểm 2.0 — Insurance Middleware Platform |
85
+ | {Thuật ngữ domain} | {Giải thích} |
86
+ | {Trạng thái / State} | {Mô tả trạng thái, quyền hạn tương ứng}. **Ghi chú lịch sử (nếu có):** {Lý do đặt tên / đổi tên}. |
87
+ | JWT | JSON Web Token — Token xác thực phiên |
88
+ | OTP | One-Time Password — Mã xác thực dùng một lần |
89
+ | TTL | Time To Live — Thời gian hiệu lực |
90
+ | PDPA | Personal Data Protection Act — Luật bảo vệ dữ liệu cá nhân |
91
+
92
+ > **Hướng dẫn:** Mỗi trạng thái entity (nếu flow có state machine) phải có entry riêng, bao gồm: mô tả, quyền hạn, và ghi chú lịch sử nếu tên từng thay đổi.
93
+
94
+ ### 1.4 References
95
+
96
+ | Tài liệu | Phiên bản | Vị trí |
97
+ |---|---|---|
98
+ | BRD NTBH | v1.3 | `_bmad-output/0-inputs/BRD-NTBH-ToanBo-v1.3.md` |
99
+ | PRD | {vX} | `_bmad-output/2-planning/prd.md` |
100
+ | Architecture | {vX} | `_bmad-output/3-solutioning/architecture.md` |
101
+ | Epic Breakdown | {vX} | `_bmad-output/3-solutioning/epics-v2.md` |
102
+ | System SRS | {vX} | `_bmad-output/2-planning/srs/SRS-NTBH-System-Full.md` |
103
+ | Figma — {Tên màn hình} | {UC-XX-0N} | [{Node ID}]({figma-link}) — {Mô tả ngắn} |
104
+ | Figma — Mobile App {Tên} | {UC-XX-0N} | Export PDF `{file.pdf}` — {Mô tả} |
105
+
106
+ ---
107
+
108
+ ## 2. Business Context
109
+
110
+ ### 2.1 Business Goals
111
+
112
+ | Metric ID | Chỉ số | Mục tiêu | Nguồn |
113
+ |---|---|---|---|
114
+ | {MX} | {Tên chỉ số} | {Giá trị mục tiêu} | PRD vX |
115
+
116
+ - {Mục tiêu nghiệp vụ 1}
117
+ - {Mục tiêu nghiệp vụ 2}
118
+
119
+ ### 2.2 Stakeholders
120
+
121
+ | Stakeholder | Vai trò | Quyền lợi |
122
+ |---|---|---|
123
+ | BA Team | Business Analyst | Đảm bảo yêu cầu nghiệp vụ đầy đủ |
124
+ | Product Owner | Product Owner | Phê duyệt scope |
125
+ | Tech Lead | Technical Lead | Đánh giá khả thi kỹ thuật |
126
+ | UX Designer | UX Designer | Thiết kế trải nghiệm người dùng |
127
+
128
+ ### 2.3 Actors / User Roles
129
+
130
+ | Actor | Mô tả | Quyền hạn |
131
+ |---|---|---|
132
+ | {Policyholder} | {Khách hàng mua bảo hiểm} | {Thực hiện luồng mua, xem thông tin} |
133
+ | {Admin} | {Nhân viên nội bộ} | {Quản trị, hỗ trợ} |
134
+ | {service-name} | Internal service tự động | {Xử lý logic backend} |
135
+ | ES: {ExternalSystem} | Hệ thống ngoài tích hợp API | Refer: TBD |
136
+
137
+ ### 2.4 Channels
138
+
139
+ - Web Mobile (Website / Webview tích hợp lên các Ứng dụng)
140
+ - {Mobile App / API / Admin Portal — điền kênh áp dụng}
141
+
142
+ ### 2.5 Assumptions
143
+
144
+ - **ASM-01:** {Giả định nghiệp vụ hoặc kỹ thuật} — {Ai chịu trách nhiệm đảm bảo giả định đúng}
145
+ - **ASM-02:** {Giả định} — {Phụ thuộc bên ngoài}
146
+
147
+ ### 2.6 Dependencies
148
+
149
+ - **Phụ thuộc service:** {service-name} phụ thuộc {external-service-1}, {external-service-2}
150
+ - **Phụ thuộc API:** {Mô tả contract API cần finalize với bên nào}
151
+ - **Phụ thuộc flow:** {FR-XX} phụ thuộc {FR-YY} kích hoạt tại bước {N}
152
+
153
+ ---
154
+
155
+ ## 3. System Overview
156
+
157
+ ### 3.1 System Description
158
+
159
+ {Mô tả tổng quan hệ thống — {service-name} đảm nhận vai trò gì trong luồng này. Liệt kê service chính, integration points, data flow tổng quan.}
160
+
161
+ | | |
162
+ |---|---|
163
+ | **Module thuộc về** | {service-name} — {Tên module} |
164
+ | **Bối cảnh pháp lý** | {Các quy định pháp luật liên quan: PDPA, Luật An ninh mạng, PCI-DSS.} |
165
+
166
+ ### 3.2 High-Level Flow
167
+
168
+ > Diagram phải phân nhánh đầy đủ — không dùng nút tổng hợp đơn giản khi thực tế có nhiều kết quả khác nhau.
169
+
170
+ ```plantuml
171
+ @startuml {FR-XX} Lifecycle Activity
172
+ skinparam backgroundColor #FAFAFA
173
+ skinparam defaultFontName Arial
174
+ skinparam defaultFontSize 12
175
+ skinparam ActivityBorderColor #0A2956
176
+ skinparam ActivityBackgroundColor #D5DBE6
177
+ skinparam ActivityDiamondBorderColor #EE0033
178
+ skinparam ActivityDiamondBackgroundColor #FFD8D8
179
+ skinparam ArrowColor #333333
180
+ skinparam startColor #EE0033
181
+ skinparam endColor #EE0033
182
+
183
+ start
184
+ :{Bước khởi đầu};
185
+
186
+ if ({Điều kiện phân nhánh chính}?) then ({Nhánh A})
187
+ :{UC-{XX}-01}: {Mô tả};
188
+ else ({Nhánh B})
189
+ if ({Điều kiện phụ}?) then ({Kết quả 1})
190
+ :{Trạng thái kết quả 1};
191
+ else ({Kết quả 2})
192
+ :{Trạng thái kết quả 2};
193
+ endif
194
+ endif
195
+
196
+ stop
197
+ @enduml
198
+ ```
199
+
200
+ ### 3.3 Architecture Overview
201
+
202
+ ```plantuml
203
+ @startuml
204
+ !pragma layout smetana
205
+ top to bottom direction
206
+ skinparam backgroundColor #2D2D3F
207
+ skinparam defaultFontColor #EEEEEE
208
+ skinparam defaultFontName Arial
209
+ skinparam defaultFontSize 11
210
+ skinparam ArrowColor #7EAAF0
211
+ skinparam componentBackgroundColor #3A3A50
212
+ skinparam componentBorderColor #555577
213
+ skinparam packageBackgroundColor #2D2D3F
214
+ skinparam packageBorderColor #555577
215
+
216
+ package "Presentation Layer" as PL #333348 {
217
+ component [{Channel 1}] as CH1 #D4A843
218
+ component [{Channel 2}] as CH2 #D4A843
219
+ }
220
+
221
+ package "{service-name}" as SVC #333348 {
222
+ component [{Component 1}] as C1
223
+ component [{Component 2}] as C2
224
+ }
225
+
226
+ package "External Systems" as EXT #333348 {
227
+ component [{External 1}] as E1
228
+ component [{External 2}] as E2
229
+ }
230
+
231
+ CH1 --> C1
232
+ CH2 --> C1
233
+ C1 --> C2
234
+ C1 --> E1
235
+ C2 --> E2
236
+
237
+ @enduml
238
+ ```
239
+
240
+ **Nguyên tắc nền tảng:**
241
+ - {Nguyên tắc kiến trúc 1}
242
+ - {Nguyên tắc kiến trúc 2}
243
+
244
+ ---
245
+
246
+ ## 4. Data Model (Tham khảo — TSD chốt)
247
+
248
+ > Mô hình dữ liệu ở đây là tham khảo nghiệp vụ. TSD của {service-name} là nguồn chính xác cho schema DB.
249
+
250
+ ### 4.1 Entity List
251
+
252
+ | Entity | Bảng DB | Mô tả | Service owner |
253
+ |--------|---------|-------|---------------|
254
+ | {EntityA} | `{table_a}` | {Mô tả} | {service-name} |
255
+ | {EntityB} | `{table_b}` | {Mô tả} | {service-name} |
256
+
257
+ ### 4.2 Entity Details (Tham khảo - TSD chốt)
258
+
259
+ #### Bảng `{table_a}`
260
+
261
+ | Field | Type | Bắt buộc | Mô tả |
262
+ |-------|------|----------|-------|
263
+ | `id` | UUID | ✅ | Primary Key |
264
+ | `{field}` | {type} | ✅ / ☐ | {Mô tả} |
265
+ | `status` | ENUM | ✅ | Trạng thái: `{StateA}` / `{StateB}` / `{StateC}` |
266
+ | `created_at` | TIMESTAMP | ✅ | Thời điểm tạo |
267
+ | `updated_at` | TIMESTAMP | ✅ | Thời điểm cập nhật cuối |
268
+
269
+ > **Ghi chú:** {Index, constraint đặc biệt nếu có.}
270
+
271
+ ### 4.3 Relationships
272
+
273
+ ```plantuml
274
+ @startuml {FR-XX} ER
275
+ skinparam backgroundColor #FAFAFA
276
+ skinparam defaultFontName Arial
277
+ skinparam defaultFontSize 11
278
+
279
+ entity "{EntityA}" as A {
280
+ * **id** : UUID <<PK>> #2255AA
281
+ --
282
+ * {field1} : {type}
283
+ * {foreign_key_id} : UUID <<FK>> #55BB77
284
+ }
285
+
286
+ entity "{EntityB}" as B {
287
+ * **id** : UUID <<PK>> #2255AA
288
+ --
289
+ * {field1} : {type}
290
+ * {ref_field} : VARCHAR <<Ref>> #D4A843
291
+ }
292
+
293
+ A ||--o{ B : "{Quan hệ 1-N}"
294
+ @enduml
295
+ ```
296
+
297
+ - {EntityA} — {EntityB}: {Mô tả quan hệ}
298
+
299
+ ### 4.4 Kafka Events
300
+
301
+ | Event | Topic | Producer | Consumers | Mô tả |
302
+ |-------|-------|----------|-----------|-------|
303
+ | `{event.name}` | `{topic-name}` | {service-name} | {consumer-1, consumer-2} | {Khi nào publish} |
304
+
305
+ ### 4.5 API Endpoints
306
+
307
+ | Method | Endpoint | Service | Mô tả | Auth |
308
+ |--------|----------|---------|-------|------|
309
+ | `POST` | `/api/v1/{resource}` | {service-name} | {Mô tả} | JWT |
310
+ | `GET` | `/api/v1/{resource}/{id}` | {service-name} | {Mô tả} | JWT |
311
+
312
+ ---
313
+
314
+ ## 5. Functional Requirements
315
+
316
+ ### 5.1 Use Case List
317
+
318
+ | UC ID | Tên | Actor | Priority | FRs | Phương pháp kiểm thử |
319
+ |---|---|---|---|---|---|
320
+ | UC-{XX}-01 | {Tên UC} | {Actor} | Must Have / Should Have / Nice to Have | FR-{XX}-01 | Manual / API / E2E |
321
+ | UC-{XX}-02 | {Tên UC} | {Actor} | Must Have | FR-{XX}-02 | API / E2E |
322
+
323
+ ### 5.2 Use Case Detail
324
+
325
+ > **Figma Web Mobile:** {Mô tả trạng thái Figma Web — màn hình nào đã có, áp dụng kênh nào.}
326
+ >
327
+ > **Figma Mobile App:** {Mô tả trạng thái Figma Mobile App — luồng nào đã có.}
328
+ >
329
+ > **Còn thiếu Figma:** {Liệt kê màn hình chưa có design. Xem Gap Analysis mục 11.4.}
330
+ >
331
+ > *(Figma Mapping tables chi tiết xem Appendix 11.1)*
332
+
333
+ ---
334
+
335
+ > **⚠️ {Ghi chú ưu tiên MVP hoặc quyết định kiến trúc quan trọng nếu có}**
336
+
337
+ #### UC-{XX}-01: {Tên Use Case}
338
+
339
+ ##### Màn hình SCR-{XX}-01 — {Tên màn hình} (Website)
340
+
341
+ > **Figma Web Mobile:** [{Tên frame} `{node-id}`]({figma-link})
342
+ > - **{Bước / State}** (`{node-id}`, {WxH}px): {Mô tả layout và các control chính}
343
+ > - **Error state** (`{node-id}`): {Mô tả}
344
+ > - **Lưu ý:** {Điểm khác biệt Figma vs SRS — cần confirm PO}
345
+
346
+ | STT | Tên control | Loại control | Require | Maxlength | Giá trị mặc định | Mô tả |
347
+ |---|---|---|---|---|---|---|
348
+ | 1 | {controlId} | Text Input / Button / Checkbox / Dropdown / DatePicker / ImageUpload | Bắt buộc / Tùy chọn / — | {N} | — | {Mô tả mục đích}. **Validate:** • {Trường hợp lỗi 1} → "{Thông báo lỗi}" • {Trường hợp lỗi 2} → "{Thông báo lỗi}" |
349
+
350
+ > **Prefix control:** `txt` TextInput · `btn` Button · `lbl` Label · `chk` Checkbox · `lnk` Link/Hyperlink · `ddl` Dropdown · `dt` DatePicker · `img` ImageUpload
351
+
352
+ ##### Màn hình SCR-{XX}-01-MOB — {Tên màn hình} (Mobile App)
353
+
354
+ > **Figma Mobile App:** Export PDF `{file.pdf}`
355
+ > - **{Thành phần}:** {Mô tả}
356
+ >
357
+ > **Khác biệt Mobile App vs Web Mobile:**
358
+ > | Tiêu chí | Web Mobile | Mobile App |
359
+ > |---|---|---|
360
+ > | {Tiêu chí 1} | {Web} | {Mobile} |
361
+ > | Input định danh | Radio SĐT / CCCD | Single input tự nhận dạng format (10 số = SĐT; 9–12 ký tự = CCCD) |
362
+
363
+ | STT | Tên control (Mobile App) | Loại control | Require | Maxlength | Giá trị mặc định | Mô tả |
364
+ |---|---|---|---|---|---|---|
365
+ | 1 | {controlId_MOB} | Text Input | Bắt buộc | 12 | — | {Mô tả}. **Lưu ý:** {Single input / format detection}. **Validate:** • {Lỗi} → "{Thông báo}" |
366
+
367
+ > **Prefix Mobile:** thêm `_MOB` suffix (VD: `txtHoTen_MOB`)
368
+
369
+ ##### Activity Diagram — UC-{XX}-01
370
+
371
+ ```plantuml
372
+ @startuml UC-{XX}-01 Activity
373
+ skinparam backgroundColor #FAFAFA
374
+ skinparam defaultFontName Arial
375
+ skinparam defaultFontSize 12
376
+ skinparam ActivityBorderColor #0A2956
377
+ skinparam ActivityBackgroundColor #D5DBE6
378
+ skinparam ActivityDiamondBorderColor #EE0033
379
+ skinparam ActivityDiamondBackgroundColor #FFD8D8
380
+ skinparam ArrowColor #333333
381
+ skinparam startColor #EE0033
382
+ skinparam endColor #EE0033
383
+
384
+ start
385
+ :(1) {Bước 1};
386
+ :(2) {Bước 2};
387
+
388
+ if ({Điều kiện}?) then (Không)
389
+ :(3a) {Bước nhánh lỗi};
390
+ stop
391
+ else (Có)
392
+ endif
393
+
394
+ :(N) {Bước cuối};
395
+ stop
396
+ @enduml
397
+ ```
398
+
399
+ ##### Mô tả luồng nghiệp vụ
400
+
401
+ | Bước | Đối tượng | Mô tả | Ghi chú | Bảng/Thực thể liên quan |
402
+ |---|---|---|---|---|
403
+ | 1 | {Actor / Frontend / service-name} | {Mô tả hành động} | {BR liên quan. EF: Exception Flow. AF: Alternative Flow.} | {table_a} |
404
+ | 2 | ES: {ExternalSystem} | {Mô tả} | Refer: TBD | — |
405
+
406
+ > **Phân nhánh DRAFT/ACTIVE edge-case (nếu có):**
407
+ >
408
+ > | Bước | Đối tượng | Mô tả | Ghi chú | Bảng/Thực thể liên quan |
409
+ > |---|---|---|---|---|
410
+ > | {N}a | {service-name} | **[Phân nhánh {StateA}]** {Mô tả xử lý} | BR-{XX}-00-01. | {entity} |
411
+ > | {N}b | {service-name} | **[Phân nhánh {StateB}]** {Mô tả xử lý} | BR-{XX}-{N}-01. | {entity} |
412
+
413
+ **Luồng thay thế:** ALT1: {Mô tả}
414
+
415
+ **Luồng ngoại lệ:** EX1: {Mô tả} ({ERR-{XX}-001}) → {Xử lý}. EX2: {Mô tả} → {Xử lý}.
416
+
417
+ **Mapping Epic:** Story {X.Y} (Epic {Z}) — {Tên Story}
418
+
419
+ ---
420
+
421
+ #### UC-{XX}-0N: {Tên Use Case tiếp theo}
422
+
423
+ > *(Lặp lại cấu trúc UC-{XX}-01 cho từng UC)*
424
+
425
+ ---
426
+
427
+ ### 5.3 Acceptance Criteria
428
+
429
+ > Trích từ {PRD vX.X}. Format: Given/When/Then. Mapping UC trong SRS này.
430
+
431
+ | AC ID | UC liên quan | Mô tả |
432
+ |---|---|---|
433
+ | AC-{FR-XX}-01 | UC-{XX}-01 | Given {điều kiện}, When {hành động}, Then {kết quả mong đợi + event published nếu có} |
434
+ | AC-{FR-XX}-02 | UC-{XX}-01 | Given {điều kiện lỗi}, When {hành động}, Then {error response + UI feedback} |
435
+ | AC-{FR-XX}-03 | UC-{XX}-02 | Given {điều kiện entity ở StateB}, When {hành động nâng cấp thành công}, Then {entity upgraded to StateA} + {event published} |
436
+
437
+ ---
438
+
439
+ ## 6. State & Behavioral Models
440
+
441
+ > Bắt buộc khi flow quản lý entity có nhiều trạng thái. Nếu không có state machine → bỏ section này.
442
+
443
+ ### 6.1 State Definitions
444
+
445
+ ```plantuml
446
+ @startuml
447
+ !pragma layout smetana
448
+ skinparam backgroundColor #2D2D3F
449
+ skinparam defaultFontColor #EEEEEE
450
+ skinparam defaultFontName Arial
451
+ skinparam defaultFontSize 11
452
+ skinparam ArrowColor #7EAAF0
453
+ skinparam ArrowFontColor #CCCCCC
454
+ skinparam stateBackgroundColor #3A3A50
455
+ skinparam stateBorderColor #555577
456
+ skinparam stateFontColor #EEEEEE
457
+
458
+ [*] --> {StateA} : {UC tạo entity — điều kiện đầy đủ}
459
+ [*] --> {StateB} : {UC tạo entity — điều kiện thiếu / shell}
460
+ {StateB} --> {StateA} : {UC nâng cấp — điều kiện hoàn chỉnh}
461
+ {StateA} --> {StateC} : {Admin deactivate / business event}
462
+ {StateC} --> {StateA} : {Admin reactivate}
463
+
464
+ state {StateA} #55BB77
465
+ state {StateB} #7777DD
466
+ state {StateC} #E06070
467
+ @enduml
468
+ ```
469
+
470
+ | Trạng thái | Mô tả | Quyền hạn | Trigger vào | Trigger ra | Ai thực hiện |
471
+ |---|---|---|---|---|---|
472
+ | {StateA} | {Mô tả}. **Có {external auth account}.** | ✅ {Quyền đầy đủ} | {UC / event tạo ra} | {UC / event chuyển ra} | System / Admin |
473
+ | {StateB} | {Mô tả — incomplete / shell}. **Không có {external auth account}.** | ✅ Xem ❌ Thực hiện | {UC / điều kiện} | {UC nâng cấp} | System (tự động) |
474
+ | {StateC} | {Mô tả — deactivated / blocked} | ❌ Mọi quyền | {Admin action / policy} | {Admin reactivate} | {Admin role} |
475
+ | *({LOCK_TEMP})* | **Không phải DB status** — cờ tạm thời trong {external system} khi {điều kiện}. `status` DB vẫn là `{StateA}`. Tự giải phóng sau {N} phút. | ❌ {Quyền bị giới hạn} | {Trigger} | {Recovery / timeout} | {External system} (tự động) |
476
+
477
+ ### 6.2 Transitions
478
+
479
+ | From | To | Điều kiện | UC trigger | Event publish |
480
+ |------|----|-----------|-----------|---------------|
481
+ | `[*]` | {StateA} | {Điều kiện đầy đủ} | UC-{XX}-01 | `{event.created}` |
482
+ | `[*]` | {StateB} | {Điều kiện thiếu} | UC-{XX}-01 | `{event.draft}` |
483
+ | {StateB} | {StateA} | {Điều kiện hoàn chỉnh} | UC-{XX}-0N | `{event.activated}` |
484
+ | {StateA} | {StateC} | Admin deactivate | UC-admin | `{event.deactivated}` |
485
+
486
+ ### 6.3 Decision Matrix — Kết quả theo điều kiện đầu vào
487
+
488
+ > Bắt buộc khi flow có ≥2 UC tạo cùng entity với kết quả trạng thái khác nhau tùy điều kiện. Giúp dev/QA tra cứu nhanh.
489
+
490
+ | UC | {Điều kiện 1} | {Điều kiện 2} | {Điều kiện 3} | Kết quả `status` | Event | {Auto-xxx}? |
491
+ |---|---|---|---|---|---|---|
492
+ | UC-{XX}-01 | {Giá trị} | {Giá trị} | {Giá trị} | **{StateA}** | `{event.name}` | ✅ |
493
+ | UC-{XX}-01 | {Giá trị khác} | {Giá trị} | — | **{StateB}** | `{event.draft}` | ❌ → UC-{XX}-0N |
494
+ | UC-{XX}-0N | Bất kỳ ({StateB} nâng cấp) | ✅ | — | **{StateA}** | `{event.activated}` | ✅ |
495
+
496
+ > **Lưu ý:**
497
+ > - `{LOCK_TEMP}` **không phải** DB status — không xuất hiện trong bảng trên.
498
+ > - {Global rule BR-{XX}-00-01} áp dụng trước mọi dòng "{External} Không".
499
+
500
+ ---
501
+
502
+ ## 7. Business Rules & Validation
503
+
504
+ ### 7.1 Business Rules
505
+
506
+ > Bắt đầu bằng nhóm **BR-{XX}-00-xx** cho global rules áp dụng toàn flow (cross-cutting: idempotency, state machine, integration pattern, identifier policy).
507
+
508
+ | Mã | Nội dung | Tham chiếu | UC liên quan |
509
+ |---|---|---|---|
510
+ | BR-{XX}-00-01 | **{Tên global rule — VD: Pre-check + State-before-external-call}:** {Mô tả đầy đủ pattern. (1) Điều kiện trigger. (2) Hành động bắt buộc trước khi gọi hệ thống ngoài. (3) Hành động sau khi hệ thống ngoài thành công.} | {Nghiệp vụ / Architecture / PRD} | UC-{XX}-01, UC-{XX}-02, ... |
511
+ | BR-{XX}-00-02 | **Quy tắc định danh toàn flow:** {Mô tả định danh nào được dùng làm lookup key.} | {Quyết định nghiệp vụ} | Tất cả UC |
512
+ | BR-{XX}-01-01 | {Nội dung BR cụ thể cho UC-{XX}-01} | PRD vX — FR-{XX}-01 | UC-{XX}-01 |
513
+ | BR-{XX}-01-02 | {Nội dung BR} | {Nguồn} | UC-{XX}-01 |
514
+
515
+ ### 7.2 Validation Rules
516
+
517
+ | Field | Rule | Thông báo lỗi |
518
+ |-------|------|---------------|
519
+ | {fieldName} | Required — không được để trống | "{Tên field} không được để trống" |
520
+ | {fieldName} | Format — {regex / pattern} | "{Thông báo lỗi format}" |
521
+ | {fieldName} | Range — {min/max} | "{Thông báo lỗi range}" |
522
+
523
+ ### 7.3 Error Handling
524
+
525
+ > Bước tương ứng với bước trong Activity Diagram mục 5.2
526
+
527
+ | STT | Bước | Trường hợp | Mã lỗi | Thông báo lỗi |
528
+ |---|---|---|---|---|
529
+ | 1 | UC-{XX}-01 Bước {N} | {Mô tả trường hợp lỗi} | ERR-{XX}-001 (HTTP {4xx/5xx}) | "{Thông báo lỗi hiển thị cho user}" |
530
+ | 2 | General | Rate limit exceeded | ERR-{XX}-{N} (HTTP 429) | "Quá nhiều yêu cầu. Vui lòng thử lại sau." |
531
+ | 3 | General | Server error | ERR-{XX}-{N} (HTTP 500) | "Hệ thống đang bận, vui lòng thử lại sau" |
532
+
533
+ ---
534
+
535
+ ## 8. Non-Functional Requirements
536
+
537
+ > Chỉ liệt kê NFR **đặc thù cho flow này**. NFR chung toàn hệ thống xem System SRS.
538
+
539
+ ### 8.1 Performance
540
+
541
+ | ID | Nhóm | Yêu cầu | Tiêu chí chấp nhận |
542
+ |---|---|---|---|
543
+ | NFR-PERF-01 | Performance | {Yêu cầu — p95 latency, throughput} | {≤ N giây / N ms} |
544
+ | NFR-SCALE-01 | CCU | Concurrent users | MVP: {N}K CCU; Year 1: {N}K CCU |
545
+ | NFR-SCALE-02 | Stateless | Service stateless | Session lưu Redis, không lưu in-memory |
546
+
547
+ ### 8.2 Security (Tham khảo)
548
+
549
+ | ID | Nhóm | Yêu cầu | Tiêu chí chấp nhận |
550
+ |---|---|---|---|
551
+ | NFR-SEC-01 | Security | {Yêu cầu bảo mật} | {Tiêu chí đo lường} |
552
+ | NFR-OBS-01 | Metrics | {Tên metric} | {Prometheus counter / histogram; Grafana dashboard; alert condition} |
553
+ | NFR-OBS-02 | Tracing | Correlation ID | Mọi request có correlationId propagate qua Kafka/HTTP |
554
+
555
+ ### 8.3 Usability (Tham khảo)
556
+
557
+ | ID | Nhóm | Yêu cầu | Tiêu chí chấp nhận |
558
+ |---|---|---|---|
559
+ | NFR-A11Y-01 | WCAG | Mức tuân thủ | WCAG 2.1 Level AA cho tất cả B2C screens |
560
+ | NFR-A11Y-02 | WCAG | Touch target | Minimum 44x44px cho mobile touch targets |
561
+
562
+ ### 8.4 Reliability (Tham khảo)
563
+
564
+ | ID | Nhóm | Yêu cầu | Tiêu chí chấp nhận |
565
+ |---|---|---|---|
566
+ | NFR-AVAIL-01 | Availability | Uptime {service-name} | ≥ {X}% |
567
+ | NFR-COMP-01 | Compliance | {Yêu cầu tuân thủ pháp lý} | {Tiêu chí} |
568
+
569
+ **Recovery Objectives:**
570
+
571
+ | Service | RPO | RTO | Rationale |
572
+ |---|---|---|---|
573
+ | {service-name} | ≤ {N} phút | ≤ {N} phút | {Lý do — tác động nếu down} |
574
+
575
+ ---
576
+
577
+ ## 9. Constraints (Tham khảo)
578
+
579
+ ### 9.1 Technical Constraints (Tham khảo)
580
+
581
+ - **CON-01 —** {Tên ràng buộc}: {Mô tả ràng buộc kỹ thuật}
582
+ - **CON-02 —** {Tên ràng buộc}: {Mô tả}
583
+
584
+ ### 9.2 Legal Constraints (Tham khảo)
585
+
586
+ - **LEG-01:** {Ràng buộc pháp lý — PDPA, Luật BVNTD, Thông tư bảo hiểm}
587
+ - **LEG-02:** {Ràng buộc tuân thủ khác}
588
+
589
+ **Yêu cầu chuyển đổi (Transition Requirements):**
590
+
591
+ > {Không áp dụng — flow mới hoàn toàn. / Hoặc: Mô tả migration plan từ hệ thống cũ.}
592
+
593
+ **Rủi ro liên quan:**
594
+
595
+ | STT | Rủi ro | Khả năng | Tác động | Giảm thiểu |
596
+ |---|---|---|---|---|
597
+ | 1 | {Mô tả rủi ro} | Cao / Trung bình / Thấp | Cao / Trung bình / Thấp | {Biện pháp giảm thiểu} |
598
+
599
+ ---
600
+
601
+ ## 10. RTM
602
+
603
+ > Truy xuất từ PRD/BRD → UC → Màn hình → BR → AC → Test Case → Epic/Story
604
+
605
+ | PRD FR | UC ID | Màn hình | BR | AC | Test Case | Epic/Story | Ghi chú |
606
+ |--------|-------|----------|----|----|-----------|------------|---------|
607
+ | FR-{XX}-01 | UC-{XX}-01 | SCR-{XX}-01, SCR-{XX}-01-MOB | BR-{XX}-01-01 | AC-{FR-XX}-01 | TC-{XX}-01 | Story {X.Y} (Epic {Z}) | {☑/☐} Web Figma {☑/☐} Mobile App Figma |
608
+ | FR-{XX}-02 | UC-{XX}-02 | SCR-{XX}-03 | BR-{XX}-02-01 | AC-{FR-XX}-03 | TC-{XX}-03 | Story {X.Y} (Epic {Z}) | Cần Figma cho SCR-{XX}-03 |
609
+
610
+ ---
611
+
612
+ ## 11. Appendix
613
+
614
+ ### 11.1 Figma Mapping
615
+
616
+ #### Mapping Figma Web Mobile ↔ SRS Screens
617
+
618
+ | SRS Screen | Figma Web Mobile | Figma Node ID | Figma Node IDs chi tiết | Ghi chú |
619
+ |---|---|---|---|---|
620
+ | SCR-{XX}-01 {Tên màn hình} | **{Tên Figma frame}** | `{node-id}` | {node IDs chi tiết} | {Ghi chú khác biệt / trạng thái} |
621
+ | SCR-{XX}-02 {Tên màn hình} | *Chưa có Figma* | — | — | Cần bổ sung |
622
+
623
+ #### Mapping Figma Mobile App ↔ SRS Screens
624
+
625
+ | SRS Screen | Figma Mobile App | Nguồn PDF | Mô tả chi tiết | Khác biệt so với Web Mobile |
626
+ |---|---|---|---|---|
627
+ | SCR-{XX}-01-MOB {Tên} (Mobile App) | **{Tên Figma frame}** | `{file.pdf}` | {Mô tả đầy đủ: control, CTA, navigation} | **(1)** {Khác biệt 1}. **(2)** {Khác biệt 2}. |
628
+
629
+ ### 11.2 Screen List
630
+
631
+ | Screen | Kênh | Figma | UC liên quan | Mô tả |
632
+ |--------|------|-------|-------------|-------|
633
+ | SCR-{XX}-01 | Web Mobile | ✅ `{node-id}` | UC-{XX}-01 | {Mô tả} |
634
+ | SCR-{XX}-01-MOB | Mobile App | ✅ PDF `{file.pdf}` | UC-{XX}-01 | {Mô tả} |
635
+ | SCR-{XX}-02 | Web Mobile | ❌ Chưa có | UC-{XX}-02 | {Mô tả} |
636
+
637
+ ### 11.3 Architecture Detail
638
+
639
+ > Xem Section 3.3 cho Architecture Overview. Phần này dành cho sơ đồ bổ sung nếu cần (sequence diagram, deployment diagram, v.v.).
640
+
641
+ ### 11.4 Chức năng ảnh hưởng
642
+
643
+ | STT | Kênh | Chức năng | Nội dung ảnh hưởng |
644
+ |---|---|---|---|
645
+ | 1 | {Kênh} | {FR-YY}: {Tên chức năng} | {Mô tả ảnh hưởng — flow dependency, event consumer, data shared.} |
646
+ | 2 | {Kênh} | {service-name} | Nhận events: `{event.name}` ({Mô tả hành động}). |
647
+
648
+ ### 11.5 Gap Analysis
649
+
650
+ > Gap đã giải quyết: strikethrough `~~GA-{XX}-01~~`. Loại: `Thiếu Figma` / `Khác biệt` / `Mâu thuẫn` / `Thiếu UC`
651
+
652
+ | Gap ID | Loại | Mô tả | Ảnh hưởng | Đề xuất xử lý |
653
+ |---|---|---|---|---|
654
+ | GA-{XX}-01 | Thiếu Figma | {Màn hình chưa có design} | {Ảnh hưởng Dev/QA} | {Cần confirm PO / UX} |
655
+
656
+ ### 11.6 Glossary
657
+
658
+ | Thuật ngữ | Định nghĩa |
659
+ |-----------|-----------|
660
+ | {Term} | {Definition} |
661
+
662
+ ---
663
+
664
+ *Tài liệu cần review bởi: Product Owner, UX Designer, Tech Lead trước khi chuyển sang Sprint Planning.*
665
+
666
+ *Các điểm cần Business confirm:*
667
+ - *{GA-{XX}-01}: {Mô tả gap / câu hỏi cần confirm}*
668
+
669
+ *-- Hết tài liệu SRS Flow {XX} --*