1. Authentication (Xác thực người dùng)
Đăng ký/Đăng nhập với Email & Password
Quên mật khẩu (Email reset)
Quản lý profile cá nhân
Multi-user support (mỗi user dữ liệu riêng biệt)
2. Quản lý Chi tiêu
Thêm/Sửa/Xóa chi tiêu với validation đầy đủ
Phân loại theo danh mục tùy chỉnh
Upload nhiều ảnh hóa đơn (Cloudinary)
Tìm kiếm và lọc chi tiêu theo nhiều tiêu chí
Lịch sử chi tiêu real-time với Firestore stream
Quick add menu với categories phổ biến
3. Quản lý Ngân sách
Tạo ngân sách theo danh mục và theo tháng
Theo dõi chi tiêu vs ngân sách real-time
Cảnh báo khi sắp hết hoặc vượt ngân sách
Chuyển số dư tháng trước tự động sang tháng mới
Thu nhập bổ sung
Tích hợp số dư tháng trước vào tổng ngân sách hiển thị
4. Dashboard & Thống kê
Dashboard tổng quan với Quick Actions
Biểu đồ chi tiêu theo tháng/năm (fl_chart)
Thống kê chi tiêu theo danh mục
So sánh chi tiêu các tháng
Smart Insights tự động
Báo cáo xuất dữ liệu
5. Thông báo Thông minh
Chào buổi sáng hàng ngày lúc 7:00 AM
Nhắc nhở ghi chi tiêu tối 8:00 PM
Cảnh báo ngân sách khi chi tiêu vượt ngưỡng
Tóm tắt tuần tự động Chủ nhật
Background tasks với WorkManager
Cá nhân hóa thông báo dựa trên hành vi người dùng
XEM THÊM ==> Hướng dẫn cài đặt chi tiết
Nguồn: Sharecode.vn
Clone source về chạy flutter pub get
thay đổi cấu hình firebase và cloudinary (nếu cần cá nhân hoá)
Firebase thay đổi google-services.json đặt vào android/app, GoogleService-Info.plist đăt vào ios/Runner
Cấu hinh rule của Firestore
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
match /expenses/{expenseId} {
allow read, write: if request.auth != null &&
resource.data.userId == request.auth.uid;
allow create: if request.auth != null &&
request.auth.uid == request.resource.data.userId;
}
match /budgets/{budgetId} {
allow read, write: if request.auth != null &&
resource.data.userId == request.auth.uid;
allow create: if request.auth != null &&
request.auth.uid == request.resource.data.userId;
}
match /categories/{categoryId} {
allow read, write: if request.auth != null &&
resource.data.userId == request.auth.uid;
allow create: if request.auth != null &&
request.auth.uid == request.resource.data.userId;
}
match /notification_settings/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Cloudinary (nơi lưu trữ ảnh) thay đổi các thông tin trong lib/core/services/cloudinary_service.dart
static const String _cloudName = 'YOUR_CLOUD_NAME'; // ← Thay bằng Cloud Name của bạn
static const String _uploadPreset = 'YOUR_PRESET_NAME'; // ← Thay bằng Preset name của bạn