Xây dựng một web app full-stack cho phép nhiều thành viên trong gia đình cùng theo dõi thu chi, quản lý nợ, tiết kiệm, ngân sách và lên kế hoạch tài chính — thay thế cách ghi chép thủ công bằng bảng tính hoặc ghi giấy.
- Các thành viên gia đình chi tiêu riêng lẻ, không ai có cái nhìn tổng thể
- Khó phân chia chi phí chung (tiền điện, chợ, thuê nhà)
- Không có nơi theo dõi nợ nần trong gia đình (ai mượn ai bao nhiêu)
- Giao dịch lặp lại (lương, tiền điện) phải nhập tay mỗi tháng
- Không theo dõi được tiến độ mục tiêu tiết kiệm
- Quản lý hụi thủ công dễ nhầm lẫn
- Đăng ký / đăng nhập với JWT
- Khôi phục mật khẩu bằng mã recovery (không cần email)
- Tạo gia đình và mời thành viên bằng mã mời + mã cá nhân
- Ví cá nhân và ví chung cho từng gia đình
- Nhập giao dịch thu/chi với danh mục
- Danh sách giao dịch theo ngày, lọc theo ví/loại
- Dashboard tổng quan: số dư, thu/chi tháng
- Nhập giao dịch bằng văn bản tự nhiên tiếng Việt
- Biểu đồ tròn theo danh mục (Recharts)
- Biểu đồ cột thu/chi theo ngày
- Xóa mềm giao dịch (soft delete, có thể khôi phục)
- Audit log — lịch sử chỉnh sửa giao dịch
- Offline queue — nhập giao dịch khi mất mạng
- Show/hide mật khẩu khi đăng nhập
- Thông báo khi phiên đăng nhập hết hạn
- Quản lý nợ & cho vay (3 loại: cá nhân / chung / nội bộ)
- Ghi nhận thanh toán từng phần cho khoản nợ
- Giao dịch định kỳ (hàng tuần / hàng tháng)
- Đề xuất xác nhận giao dịch định kỳ đến hạn
- Quỹ tiết kiệm (SavingsGoal) — cá nhân & gia đình
- Yêu cầu rút tiết kiệm với phê duyệt
- Hụi (Rotating Savings Club) — quản lý các kỳ đóng/hốt
- Dự thu / Dự chi (PlanItem) — lịch tài chính cá nhân
- Ngăn ví (WalletPocket) — envelope budgeting trong ví cá nhân
- Quỹ phụ gia đình (SubFund) — tách quỹ riêng trong ví chung
- Ngân sách tuần theo danh mục (WeeklyBudget)
- Ngân sách tháng chi tiết (MonthlyBudget)
- Nhãn người nhận (RecipientLabel) — tag giao dịch theo người
- Danh mục tuỳ chỉnh theo user (ngoài danh mục mặc định)
- Xuất CSV danh sách giao dịch
- Thống kê thu/chi theo tuần (weekly summary)
- Chuyển tiền giữa các ví (transfers)
- Tỷ giá ngoại tệ (ExchangeRate)
- Nhiều ví cá nhân / đa ví (multiple personal wallets)
- tokenVersion — thu hồi toàn bộ phiên đăng nhập (logout all)
- isAppAdmin — admin cấp toàn hệ thống tách biệt admin gia đình
- Real-time cập nhật qua WebSocket (Socket.IO) + tokenVersion validation
- Idempotency key — chống duplicate khi mạng không ổn định
- Rate limiting bảo vệ API
- Chuyển database từ SQLite → PostgreSQL
- Hỗ trợ biến môi trường VITE_API_URL cho deploy
| Quyết định | Lý do |
|---|---|
| PostgreSQL (thay SQLite ban đầu) | Cần concurrent writes, relations phức tạp, sẵn sàng cho production |
| Prisma ORM | Type-safe, migration dễ, phù hợp TypeScript |
| JWT + tokenVersion | Stateless nhưng vẫn có thể thu hồi phiên mà không cần session store |
| Recovery code thay vì email reset | Tránh phụ thuộc email service, phù hợp môi trường gia đình |
| Socket.IO real-time | Thành viên thấy ngay khi người khác nhập giao dịch |
| TailwindCSS | Phát triển UI nhanh, không cần viết CSS thủ công |
| Vite | Build nhanh hơn Create React App nhiều lần |
| WalletPocket (envelope budgeting) | Phù hợp văn hoá chia tiền theo mục đích ở VN |
| Hui model riêng | Hụi có logic đặc thù (bidAmount, kỳ hốt) khác giao dịch thông thường |
Family ──── User[]
Family ──── Wallet (SharedWallet)
Family ──── SubFund[] ──── Wallet
User ──── Wallet[] (PERSONAL)
User ──── SavingsGoal[]
User ──── Hui[]
User ──── PlanItem[]
User ──── MonthlyBudget[]
User ──── WeeklyBudget[]
User ──── RecipientLabel[]
User ──── Category[] (custom)
Wallet ──── WalletPocket[]
Wallet ──── Transaction[]
Transaction ──── Category
Transaction ──── WalletPocket?
Transaction ──── RecipientLabel?
Transaction ──── TransactionLog[]
Debt ──── DebtPayment[]
RecurringTransaction ──── TransactionProposal[]
Hui ──── HuiRound[]
SavingsGoal ──── SavingsContribution[]
SavingsGoal ──── SavingsWithdrawalRequest[] ──── SavingsWithdrawalApproval[]
PlanItem ──── PlanCompletion[]
- Deploy backend lên Railway / Render (PostgreSQL đã sẵn sàng)
- Deploy frontend lên Vercel
- Thêm thông báo push (PWA) khi giao dịch định kỳ đến hạn
- Báo cáo tài chính theo tháng/quý dạng PDF
- Import giao dịch từ file CSV (sao kê ngân hàng)
- Phân quyền chi tiết hơn trong SubFund (ADMIN vs MEMBER)