VCT PLATFORM — Sơ đồ Nghiệp vụHệ thống multi-tenant 4 cấp: Quốc gia → Tỉnh → Quận/Huyện → CLB. Mỗi cấp có vai trò và quyền hạn riêng biệt.
graph TD
VCT["🏛 Liên đoàn VCT Việt Nam
Federation - Tenant gốc"]
VCT --> BKT["📋 Ban Kỹ thuật"]
VCT --> BTT["⚖ Ban Trọng tài"]
VCT --> BKL["⚖ Ban Kỷ luật"]
VCT --> BTC_QG["💰 Ban Tài chính"]
VCT --> BDN["🌐 Ban Đối ngoại"]
VCT --> HN["🌏 LĐ Hà Nội"]
VCT --> BD["🌏 LĐ Bình Định"]
VCT --> HCM["🌏 LĐ TP.HCM"]
VCT --> DOTS["🌏 ... 31 LĐ Tỉnh khác"]
HN --> HN_BCH["👥 Ban chấp hành tỉnh"]
HN --> HN_QH["🏢 Hội/Chi hội Quận/Huyện"]
HN --> HN_TT["⚖ TT cấp tỉnh"]
HN_QH --> CLB1["🏠 CLB Thăng Long VCT"]
HN_QH --> CLB2["🏠 CLB Bạch Đằng"]
HN_QH --> CLB3["🏠 ..."]
CLB1 --> HLV1["🥋 HLV"]
CLB1 --> VS1["🏃 Võ sinh / VĐV"]
CLB1 --> LOP1["📚 Lớp học"]
BD --> BD_CLB["🏠 CLB Bình Định các"]
HCM --> HCM_CLB["🏠 CLB TP.HCM các"]
style VCT fill:#4f46e5,color:#fff,stroke:#4f46e5
style HN fill:#16a34a,color:#fff,stroke:#16a34a
style BD fill:#16a34a,color:#fff,stroke:#16a34a
style HCM fill:#16a34a,color:#fff,stroke:#16a34a
style CLB1 fill:#0891b2,color:#fff,stroke:#0891b2
style CLB2 fill:#0891b2,color:#fff,stroke:#0891b2
Hệ thống 12 vai trò phân cấp — mỗi vai trò chỉ truy cập được dữ liệu trong phạm vi tổ chức (tenant isolation).
graph LR
subgraph PLATFORM["⚙ Platform Level"]
admin["🔴 admin
Toàn quyền hệ thống"]
end
subgraph FEDERATION["🏛 Federation Level"]
president["🟣 federation_president
Chủ tịch LĐ"]
secretary["🟣 federation_secretary
Tổng Thư ký"]
tech_dir["🔵 technical_director
Giám đốc Kỹ thuật"]
end
subgraph PROVINCE["🌏 Provincial Level"]
prov_admin["🟢 provincial_admin
Admin LĐ Tỉnh"]
end
subgraph TOURNAMENT["🏆 Tournament Level"]
btc["🟠 btc
Ban Tổ Chức"]
ref_mgr["🩷 referee_manager
Tổng Trọng tài"]
referee["🩷 referee
Trọng tài"]
medical["🟠 medical_staff
Y tế"]
end
subgraph MEMBER["🏃 Member Level"]
coach["🟢 coach
HLV"]
delegate["🔵 delegate
Trưởng đoàn"]
athlete["🟢 athlete
VĐV - Read only"]
end
admin --> president
admin --> prov_admin
president --> secretary
president --> tech_dir
prov_admin --> btc
btc --> ref_mgr
ref_mgr --> referee
btc --> medical
prov_admin --> coach
coach --> delegate
delegate --> athlete
4 tầng kiến trúc: Client → API Gateway → Domain Services → Data Infrastructure. Event-driven với WebSocket.
graph TB
subgraph CLIENTS["📱 Frontend Clients"]
WEB["🖥 Web App
Next.js + React"]
MOB["📱 Mobile
Expo / React Native"]
PWA["📱 PWA
Offline Support"]
PUB["👁 Spectator Portal
Public"]
end
subgraph GATEWAY["🔐 API Gateway & Middleware"]
AUTH["🔑 JWT Auth
Access + Refresh Token"]
RBAC["👮 RBAC Middleware
12 Roles"]
RATE["⚡ Rate Limiter"]
AUDIT["📝 Audit Logger"]
end
subgraph DOMAIN["⚙ Domain Services - 23 Modules"]
direction LR
FED[federation]
PROV[provincial]
CLUB[club]
TOUR[tournament]
SCORE[scoring]
ATH[athlete]
DISC[discipline]
APPR[approval]
FIN[finance]
TRAIN[training]
CERT[certification]
BRACK[bracket]
PAR[parent]
DOC[document]
INTL[international]
end
subgraph INFRA["🗄 Data & Infrastructure"]
PG["🐘 PostgreSQL
ACID + RLS + Migrations"]
WS["⚡ WebSocket Hub
Live Scoring"]
EVT["📋 Event Bus
Domain Events"]
NOTIF["🔔 Notifications
Push / Email / SMS"]
STORE["📁 File Storage"]
end
CLIENTS --> GATEWAY
GATEWAY --> DOMAIN
DOMAIN --> INFRA
WS -.->|"real-time"| CLIENTS
EVT -.->|"triggers"| NOTIF
Sơ đồ dữ liệu luân chuyển hai chiều giữa các phân hệ qua REST API và WebSocket.
graph TD
LDQG["🏛 LĐ Quốc gia"]
LDT["🌏 34 LĐ Tỉnh/TP"]
CLB["🏠 1000+ CLB"]
GIAI["🏆 Giải đấu"]
TT["⚖ Trọng tài"]
VDV["🏃 50K+ VĐV"]
KL["⚖ Kỷ luật"]
TC["💰 Tài chính"]
PH["👁 Công chúng"]
LDQG -->|"Quy chế, Master Data"| LDT
LDQG -->|"Config giải"| GIAI
LDQG -->|"Ban Kỷ luật"| KL
LDT -->|"Báo cáo"| LDQG
LDT -->|"Quản lý CLB"| CLB
LDT -->|"ĐK đoàn"| GIAI
LDT -->|"Hồ sơ VĐV"| VDV
CLB -->|"ĐK VĐV"| GIAI
CLB -->|"Quản lý VĐV"| VDV
CLB -->|"Hồ sơ"| LDT
GIAI -->|"Phân công sàn"| TT
GIAI -->|"Kết quả, BXH"| VDV
GIAI -->|"Vi phạm"| KL
GIAI -->|"Live Score"| PH
GIAI -->|"KQ tổng hợp"| LDQG
TT -->|"Điểm real-time"| GIAI
TT -.->|"WebSocket"| PH
KL -->|"Đình chỉ"| VDV
KL -->|"Xử phạt"| CLB
KL -->|"Cấm thi đấu"| GIAI
KL -->|"Báo cáo"| LDQG
TC -->|"Hóa đơn"| CLB
TC -->|"Hội phí"| LDT
TC -->|"Phí giải"| GIAI
style LDQG fill:#4f46e5,color:#fff
style LDT fill:#16a34a,color:#fff
style CLB fill:#0891b2,color:#fff
style GIAI fill:#d97706,color:#fff
style TT fill:#db2777,color:#fff
style VDV fill:#16a34a,color:#fff
style KL fill:#dc2626,color:#fff
style TC fill:#6366f1,color:#fff
style PH fill:#64748b,color:#fff
Từ khởi tạo giải → đăng ký → vận hành → kết thúc. Mỗi giai đoạn có trạng thái và vai trò chịu trách nhiệm riêng.
stateDiagram-v2
[*] --> Draft: LĐ/BTC tạo giải
Draft --> Configuration: Cấu hình nội dung, hạng cân
Configuration --> OpenRegistration: Mở đăng ký
OpenRegistration --> ClosedRegistration: Hết hạn / BTC đóng
OpenRegistration --> OpenRegistration: CLB đăng ký đoàn & VĐV
ClosedRegistration --> WeighIn: Cân đo kiểm tra
WeighIn --> DrawBracket: Bốc thăm xếp lịch
DrawBracket --> InProgress: Bắt đầu thi đấu
InProgress --> InProgress: Chấm điểm real-time 🔴
InProgress --> Completed: Tất cả nội dung kết thúc
Completed --> Finalized: Duyệt KQ + Trao giải
Finalized --> Archived: Lưu trữ
Finalized --> [*]
OpenRegistration --> Cancelled: Hủy giải
Draft --> Cancelled: Hủy giải
Cancelled --> [*]
note right of InProgress
WebSocket live scoring
5 giám định/sàn
Auto bracket update
end note
Từ khi đăng ký vào CLB → huấn luyện → thi đai → thi đấu → thành tích → chuyển nhượng. Vòng lặp suốt sự nghiệp.
graph LR
A["📝 Đăng ký
CLB nhập hồ sơ"] --> B["🥋 Huấn luyện
Lộ trình đai, lớp, điểm danh"]
B --> C["🎓 Thi lên Đai
Lý thuyết + Thực hành + Thể lực"]
C --> D["🏆 Thi đấu
ĐK giải, cân đo, thi"]
D --> E["📊 BXH & Thành tích
Huy chương, xếp hạng"]
E --> B
D --> F["⚖ Vi phạm?"]
F -->|"Không"| E
F -->|"Có"| G["🚨 Kỷ luật
Đình chỉ / Cấm thi"]
G --> B
B --> H["🔄 Chuyển nhượng
Sang CLB mới (Approval)"]
H --> B
E --> I["🥋 Lên Huyền đai
Trở thành HLV"]
style A fill:#16a34a,color:#fff
style C fill:#9333ea,color:#fff
style D fill:#d97706,color:#fff
style G fill:#dc2626,color:#fff
CLB nộp hồ sơ qua platform → LĐ Tỉnh xét duyệt → LĐ Quốc gia phê duyệt (nếu cần) → Cấp mã.
sequenceDiagram
participant CLB as 🏠 CLB (Người sáng lập)
participant SYS as ⚙ VCT Platform
participant LDT as 🌏 LĐ Tỉnh
participant LDQG as 🏛 LĐ Quốc gia
CLB->>SYS: Nộp hồ sơ thành lập
Note over CLB,SYS: Tên CLB, địa chỉ, HLV trưởng,
giấy phép, ảnh cơ sở
SYS->>SYS: Tạo Approval Request (pending)
SYS->>LDT: 🔔 Thông báo yêu cầu mới
LDT->>SYS: Xem hồ sơ chi tiết
alt Thiếu giấy tờ
LDT->>SYS: Return (yêu cầu bổ sung)
SYS->>CLB: 🔔 Thông báo cần bổ sung
CLB->>SYS: Nộp bổ sung
SYS->>LDT: 🔔 Hồ sơ đã cập nhật
end
LDT->>SYS: ✅ Approve bước 1
SYS->>LDQG: 🔔 Chuyển phê duyệt bước 2
LDQG->>SYS: ✅ Approve bước 2
SYS->>SYS: Cấp mã CLB + Tạo tenant
SYS->>CLB: 🔔 CLB đã được phê duyệt!
SYS->>LDT: 🔔 CLB đã hoạt động
Note over SYS: Audit log ghi nhận toàn bộ
Quy trình 3 bước phê duyệt: CLB mới tạo yêu cầu → CLB cũ đồng ý → LĐ Tỉnh xác nhận.
sequenceDiagram
participant NEW as 🏠 CLB mới
participant SYS as ⚙ Platform
participant OLD as 🏠 CLB cũ
participant LDT as 🌏 LĐ Tỉnh
participant VDV as 🏃 VĐV
NEW->>SYS: Tạo yêu cầu chuyển nhượng VĐV
SYS->>SYS: Tạo Approval (3 bước)
SYS->>OLD: 🔔 Yêu cầu cho VĐV chuyển
OLD->>SYS: ✅ Đồng ý (Bước 1)
SYS->>LDT: 🔔 Xin phê duyệt chuyển nhượng
LDT->>SYS: Kiểm tra điều kiện
Note over LDT,SYS: Không nợ phí, không đang bị kỷ luật,
đủ thời gian tối thiểu tại CLB cũ
LDT->>SYS: ✅ Phê duyệt (Bước 2)
SYS->>SYS: Cập nhật CLB_ID của VĐV
SYS->>VDV: 🔔 Bạn đã chuyển sang CLB mới
SYS->>NEW: 🔔 VĐV đã gia nhập
SYS->>OLD: 🔔 VĐV đã rời CLB
Note over SYS: Lịch sử CLB được lưu trữ
Engine phê duyệt đa bước tổng quát — áp dụng cho CLB, chuyển nhượng, giải đấu, chứng chỉ, kỷ luật.
stateDiagram-v2
[*] --> pending: Submit yêu cầu
pending --> in_review: Người duyệt mở xem
in_review --> approved: ✅ Approve
in_review --> rejected: ❌ Reject (bắt buộc lý do)
in_review --> returned: ↩ Return (yêu cầu bổ sung)
returned --> pending: Người tạo cập nhật & re-submit
approved --> approved: Bước tiếp (nếu multi-step)
pending --> cancelled: Người tạo hủy
in_review --> cancelled: Người tạo hủy
pending --> expired: ⏰ Quá hạn deadline
in_review --> expired: ⏰ Quá hạn deadline
approved --> [*]: Hoàn tất (all steps done)
rejected --> [*]
cancelled --> [*]
expired --> [*]
note right of approved
Mỗi bước ghi:
- action_by (UUID)
- action_at (timestamp)
- comment (text)
- from_step → to_step
end note
note left of pending
Áp dụng cho:
- CLB mới
- Chuyển nhượng VĐV
- Đăng cai giải
- Cấp chứng chỉ
- Thi lên đai
- Khiếu nại
end note
HLV đề nghị → Thi 4 phần (Lý thuyết 20% + Quyền 40% + Kỹ thuật 20% + Thể lực 20%) → Tổng ≥65 điểm → Cấp đai.
graph TD
A["🥋 HLV đề nghị
VĐV đủ tháng tập"] --> B["📝 Tạo đơn thi đai"]
B --> C{"LĐ Tỉnh
duyệt đơn?"}
C -->|"❌ Từ chối"| Z1["Trả lại CLB"]
C -->|"✅ Duyệt"| D["📖 Phần 1: Lý thuyết
Viết/vấn đáp — 20%"]
D --> E["🥋 Phần 2: Quyền thuật
Bắt buộc + Tự chọn — 40%"]
E --> F["⚔ Phần 3: Kỹ thuật/Đối luyện
Thực hành — 20%"]
F --> G["💪 Phần 4: Thể lực
Chống đẩy, bụng, chạy — 20%"]
G --> H{"Tổng ≥ 65
điểm?"}
H -->|"✅ Đạt"| I["🎓 Cấp chứng nhận đai mới"]
H -->|"Trượt 1 môn"| J["⏳ Thi lại sau 3 tháng"]
H -->|"Trượt ≥2 môn"| K["⏳ Thi lại toàn bộ sau 6 tháng"]
I --> L["📋 Cập nhật hồ sơ VĐV"]
L --> M["🔔 Thông báo CLB & VĐV"]
style A fill:#16a34a,color:#fff
style I fill:#4f46e5,color:#fff
style J fill:#d97706,color:#fff
style K fill:#dc2626,color:#fff
Event-driven: TT chấm → WebSocket broadcast → Scoreboard, Bracket, Notification, Integrity đồng thời.
sequenceDiagram
participant BTC as 🏆 BTC
participant TT as ⚖ Trọng tài (x5)
participant API as ⚙ API Server
participant WS as ⚡ WebSocket Hub
participant SB as 📊 Scoreboard
participant BR as 🏅 Bracket
participant NT as 🔔 Notifications
participant IG as 🚨 Integrity Check
BTC->>API: Mở trận (gán VĐV + sàn)
API->>WS: Broadcast "match.started"
WS->>SB: Hiển thị trận
loop Mỗi hiệp / mỗi đòn
TT->>API: Submit điểm (tablet)
API->>API: Validate & Save to DB
API->>WS: Broadcast "score.submitted"
par Fan-out Events
WS->>SB: Update Scoreboard LIVE
WS->>BR: Cập nhật bracket (nếu kết thúc)
API->>NT: Push to đoàn + VĐV
API->>IG: Kiểm tra gian lận điểm
end
end
BTC->>API: Kết thúc trận
API->>API: Bỏ điểm cao/thấp nhất → TB
API->>WS: Broadcast "match.completed"
WS->>SB: Hiện kết quả chính thức
API->>BR: Auto-advance winner
Từ phát hiện vi phạm → điều tra → điều trần → xử phạt → giám sát thi hành. 10 loại VP, 7 hình thức xử phạt.
stateDiagram-v2
[*] --> reported: 🚨 Phát hiện vi phạm
reported --> investigating: Mở hồ sơ, phân loại mức độ
investigating --> hearing_scheduled: Đủ chứng cứ → Lập lịch điều trần
investigating --> dismissed: Không đủ cơ sở → Bác bỏ
hearing_scheduled --> hearing: ⚖ Phiên điều trần
hearing --> sanctioned: Có vi phạm → Xử phạt
hearing --> dismissed: Không vi phạm → Bác bỏ
sanctioned --> monitoring: Thi hành quyết định
monitoring --> completed: Hết thời hạn xử phạt
monitoring --> escalated: Vi phạm thêm → Tăng nặng
escalated --> sanctioned: Xử phạt nặng hơn
completed --> [*]
dismissed --> [*]
note right of sanctioned
7 Hình thức:
• Cảnh cáo
• Phạt tiền
• Đình chỉ thi đấu
• Cấm vĩnh viễn
• Hủy kết quả
• Quản chế
• Chuyển pháp luật
end note
note left of reported
10 Loại vi phạm:
• Khai gian cân/tuổi
• Phi thể thao
• Doping
• Vi phạm quy chế
• Xúc phạm TT
• Giả mạo giấy tờ
• Dàn xếp kết quả
• Vi phạm an toàn
• Hành chính
end note
Từ nộp hồ sơ → đào tạo → thi → Ban KT duyệt → TTK cấp chứng chỉ (ký số PKI). Hiệu lực 3-4 năm.
graph LR
A["📝 Nộp hồ sơ
Bằng cấp + KN"] --> B["📖 Đào tạo
Khóa 3-7 ngày"]
B --> C["🥋 Thi thực hành
Chấm / Vận hành"]
C --> D{"Đạt?"}
D -->|"❌"| E["Thi lại
Sau 6 tháng"]
D -->|"✅"| F["📋 Ban KT duyệt"]
F --> G["🔏 TTK cấp CC
Ký số PKI"]
G --> H["📅 Hiệu lực
3-4 năm"]
H --> I{"Hết hạn?"}
I -->|"Gia hạn"| J["📝 Nộp đơn GH
50% phí cấp mới"]
J --> F
I -->|"Không GH"| K["❌ Hết hiệu lực"]
style A fill:#6366f1,color:#fff
style G fill:#16a34a,color:#fff
style K fill:#dc2626,color:#fff
4 luồng thu phí chính: Giải đấu, Chứng chỉ, Hội phí, Sự kiện. Audit trail đầy đủ.
graph TD
subgraph PHIGIAI["🏆 Phí Giải đấu"]
G1["Phí/VĐV: 50K-500K"]
G2["Phí/Đoàn: 500K-5M"]
G3["Đặt cọc: 0-10M"]
end
subgraph PHICC["📜 Phí Chứng chỉ"]
C1["HLV: 1M-2M"]
C2["TT: 800K-3M"]
C3["Gia hạn: 50% phí gốc"]
end
subgraph HOIPHI["💳 Hội phí Thường niên"]
H1["VĐV: 200K/năm"]
H2["HLV/TT: 500K/năm"]
H3["CLB: 2M-5M/năm"]
H4["LĐ Tỉnh: 10M/năm"]
end
subgraph PHIDAI["🥋 Phí Thi Đai"]
D1["Đai màu: 200K+100K"]
D2["Huyền đai 1-3: 500K+300K"]
D3["Huyền đai 4+: 1M+500K"]
end
PHIGIAI --> INV["📄 Tạo hóa đơn"]
PHICC --> INV
HOIPHI --> INV
PHIDAI --> INV
INV --> NOTIFY["📧 Gửi thông báo
Email + Push + SMS"]
NOTIFY --> PAY["🏦 Thanh toán
Online / Chuyển khoản"]
PAY --> CONFIRM["✅ Xác nhận
Tự động / Thủ công"]
CONFIRM --> REPORT["📊 Báo cáo tổng hợp"]
REPORT --> AUDIT_F["🔍 Kiểm toán"]
style INV fill:#d97706,color:#fff
style CONFIRM fill:#16a34a,color:#fff
style AUDIT_F fill:#6366f1,color:#fff
14 cấp bậc đai từ Trắng → Cửu đẳng Huyền đai. Timeline từ 0 đến 50+ năm tu luyện.
graph LR
W["⬜ Trắng
0 tháng"] --> Y["🟡 Vàng
6 tháng"]
Y --> G["🟢 Xanh lá
12 tháng"]
G --> B["🔵 Xanh dương
24 tháng"]
B --> BR["🟤 Nâu
36 tháng"]
BR --> H1["⬛ Sơ đẳng
4 năm - HLV tập sự"]
H1 --> H2["⬛ Nhị đẳng
6 năm - Dạy độc lập"]
H2 --> H3["⬛ Tam đẳng
9 năm - HLV tỉnh"]
H3 --> H4["⬛ Tứ đẳng
13 năm - HLV QG"]
H4 --> H5["⬛ Ngũ đẳng
18 năm - VÕ SƯ"]
H5 --> H6["⬛ Lục đẳng
24 năm"]
H6 --> H7["⬛ Thất đẳng
31 năm - ĐẠI VÕ SƯ"]
H7 --> H89["⬛ Bát-Cửu đẳng
40-50 năm - VINH DANH"]
style W fill:#e2e8f0,color:#334155
style Y fill:#fbbf24,color:#78350f
style G fill:#22c55e,color:#fff
style B fill:#3b82f6,color:#fff
style BR fill:#92400e,color:#fff
style H1 fill:#1e293b,color:#f1f5f9
style H5 fill:#4f46e5,color:#fff
style H7 fill:#9333ea,color:#fff
style H89 fill:#dc2626,color:#fff
Timeline một ngày thi đấu từ check-in sáng → cân đo → thi đấu → trao giải. Mỗi bước có vai trò chịu trách nhiệm.
sequenceDiagram
participant DOAN as 👥 Đoàn/VĐV
participant BTC as 🏆 BTC Giải
participant YTE as 🏥 Ban Y tế
participant TTT as ⚖ Tổng TT
participant TT as ⚖ Trọng tài
participant SYS as ⚙ Platform
rect rgb(40, 60, 40)
Note over DOAN,SYS: ☀ SÁNG — Check-in & Chuẩn bị
DOAN->>BTC: Check-in đoàn (quét QR)
BTC->>SYS: Xác nhận có mặt
BTC->>YTE: Chuyển VĐV cân đo
YTE->>SYS: Ghi cân nặng, kiểm tra sức khỏe
YTE->>BTC: Cấp phép thi đấu ✅
BTC->>SYS: Khóa danh sách VĐV đủ ĐK
end
rect rgb(60, 40, 40)
Note over DOAN,SYS: ⚔ THI ĐẤU — Real-time Scoring
TTT->>TT: Phân công sàn + trận
BTC->>SYS: Mở trận (gán VĐV)
SYS->>TT: 🔔 Trận sắp bắt đầu
loop Mỗi trận
TT->>SYS: Chấm điểm real-time 📱
SYS->>SYS: ⚡ WebSocket broadcast
SYS->>DOAN: 📊 Update scoreboard
end
BTC->>SYS: Kết thúc → Auto bracket
end
rect rgb(40, 40, 60)
Note over DOAN,SYS: 🏅 CHIỀU — Trao giải & Tổng kết
SYS->>BTC: Tổng hợp kết quả toàn đoàn
BTC->>DOAN: 🏅 Trao HCV / HCB / HCĐ
BTC->>SYS: Finalize kết quả
SYS->>SYS: Cập nhật BXH VĐV + thành tích
end