Thêm tính năng trong mục 4.1 của ARCHITECTURE.md

This commit is contained in:
2026-06-13 20:14:52 +07:00
parent b54707823c
commit c51ddc34c7
13 changed files with 343 additions and 60 deletions
+27 -33
View File
@@ -31,44 +31,38 @@ Hệ thống được thiết kế theo mô hình **Client-Server** kết hợp
Dưới đây là các thực thể cốt lõi phục vụ tính năng:
### 3.1. Users & Authentication
* `users`: Lưu thông tin định danh (`id`, `email`, `password_hash`, `name`, `avatar`).
### 3.1. User (Người dùng)
Lưu trữ thông tin định danh và trạng thái quản trị. Toàn bộ ID sử dụng định dạng **UUID**.
* `User`: `id`, `email`, `passwordHash`, `name`, `avatar`, `isAdmin`, `isBlocked`, `createdAt`.
### 3.2. Tour & Members (Quản lý đa người dùng & Phân quyền)
* `tours`: Thông tin tổng quan về chuyến đi.
* `id` (PK), `title`, `start_date`, `end_date`, `creator_id` (FK), `created_at`.
* `tour_members`: Bảng trung gian quản lý thành viên và quyền hạn (Bảo mật thông tin).
* `tour_id` (FK), `user_id` (FK).
* `role`: Định nghĩa các quyền cụ thể:
* `OWNER`: Toàn quyền (Người tạo).
* `EDITOR`: Sửa đổi kế hoạch, chi phí, xem/thêm ảnh.
* `MEMBER_PLAN_ONLY`: Chỉ xem/sửa kế hoạch, không xem được chi phí.
* `MEMBER_PHOTO_ONLY`: Chỉ được xem/đăng ảnh trong album, không thấy kế hoạch và chi phí.
* `VIEWER_EXTERNAL`: Người ngoài được share link, chỉ xem được ảnh công khai (tùy thuộc vào cài đặt privacy).
### 3.3. Itinerary & Map (Chặng & Địa điểm)
* `legs` (Chặng): Một tour có nhiều chặng.
* `id` (PK), `tour_id` (FK), `sequence_number` (Thứ tự chặng: 1, 2, 3...), `notes`.
* `places` (Địa điểm trong chặng):
* `id` (PK), `leg_id` (FK), `name`, `address`, `latitude`, `longitude` (Dữ liệu PostGIS), `sequence_in_leg`.
* `arrival_time` (Dự kiến), `departure_time` (Dự kiến).
### 3.2. Tour & Phân quyền (RBAC)
Hệ thống sử dụng bảng trung gian để quản lý thành viên cho từng chuyến đi.
* `Tour`: `id`, `title`, `startDate`, `endDate`, `totalCost` (Decimal), `createdById` (FK -> User).
* `TourParticipant`: Quản lý vai trò thành viên trong Tour qua enum `ParticipantRole`:
* `OWNER`: Toàn quyền quản lý.
* `MANAGER`: Quản lý nội dung và thành viên.
* `MEMBER`: Thành viên chính thức (Xem được chi phí).
* `MEMBER_NO_FINANCE`: Thành viên không được xem thông tin tài chính.
* `VIEWER_ONLY`: Chỉ xem lộ trình và ảnh.
### 3.4. Expenses (Chi phí)
* `expenses`: Lưu vết chi phí cho từng địa điểm/chặng.
* `id` (PK), `leg_id` (FK), `place_id` (FK, nullable), `category` (`LODGING`, `DINING`, `TRANSPORT`, `OTHER`), `amount` (Số tiền), `currency`, `description`.
* `tour_cost_summaries`: Cấu hình phân chia tin ở cuối tour/chặng.
* `tour_id` (FK), `total_cost`, `adult_count`, `child_count`, `child_discount_percent` (Ví dụ: trẻ em giảm 30%).
### 3.3. Lộ trình (Leg & Location)
Một Tour được chia thành nhiều chặng di chuyển (Leg), mỗi chặng chứa danh sách các điểm đến (Location).
* `Leg`: `id`, `tourId` (FK), `sequence` (Thứ tự chặng), `note`.
* `Location`: Tích hợp tính năng theo dõi tiến độ (Thay thế khái niệm `Task` cũ).
* Tọa độ: `latitude`, `longitude`.
* Thời gian: `plannedStart`, `plannedEnd`, `actualStart`, `actualEnd`.
* Trạng thái (`LocationStatus`): `PENDING` (Chờ), `COMPLETED` (Hoàn thành).
* Loại địa điểm (`LocationType`): `MOVE`, `VISIT`, `REST`, `EAT`.
### 3.5. Tasks & Timeline Tracking (Theo dõi tiến độ)
* `tasks`: Các hoạt động cần tích chọn hoàn thành.
* `id` (PK), `tour_id` (FK), `leg_id` (FK), `title`, `planned_timestamp`.
* `is_completed` (Boolean).
* `completed_at` (Timestamp - Ghi lại lúc hệ thống tự động tích hoặc user chủ động tích).
* `trigger_type` (`AUTO_BY_TIME` hoặc `MANUAL_BY_USER`).
### 3.4. Chi phí (Expense)
Quản lý tài chính cho từng chặng hoặc gắn trực tiếp vào một địa điểm cụ thể.
* `Expense`: `id` (UUID, PK), `leg_id` (UUID, FK), `location_id` (UUID, FK, Nullable), `category` (Enum: `ACCOMMODATION`, `FOOD`, `TRANSPORT`, `TICKET`, `OTHER`), `amount` (Decimal), `description` (Text).
### 3.6. Album Ảnh (Tách biệt logic kế hoạch)
* `photos`: Lưu trữ hình ảnh của tour gắn với địa điểm.
* `id` (PK), `tour_id` (FK), `place_id` (FK, nullable), `uploader_id` (FK), `image_url` (Đường dẫn S3), `captured_at` (Metadata từ ảnh hoặc thời gian tạo), `privacy_level` (`PUBLIC_IN_TOUR`, `PRIVATE_OWNER`).
### 3.5. Album Ảnh (Photo)
Lưu trữ tài nguyên đa phương tiện gắn với bối cảnh chuyến đi.
* `Photo`: `id`, `tourId` (FK), `locationId` (FK, nullable), `uploaderId` (FK), `imageUrl`, `privacy`.
* Cấp độ bảo mật (`PrivacyLevel`): `PUBLIC`, `TOUR_ONLY`, `PRIVATE`.
---