- Add goals feature (models, migrations, API, web pages) - Add reserved/centralized wallet balance service - Add wallet detail page and overview components - Add new UI components (progress, multi-select, FAB) - Remove stray empty -H/-d files from working tree
10 KiB
Executable File
🎯 Goals Feature - Implementation Progress
Started: October 22, 2025
Status: Backend Complete ✅ | Frontend Pending
Progress: 60% Complete
✅ Completed - Backend (100%)
1. Database Schema ✅
Created 3 new models in Prisma:
Goal Model:
- Tracks user goals with target amount, currency, deadline
- Supports images, categories, and status tracking
- Auto-calculates current amount from allocations
- Includes team support (for future feature)
GoalAllocation Model:
- Links wallets to goals
- Supports multi-currency with exchange rates
- Tracks who made each allocation
- Includes notes for each contribution
GoalMilestone Model:
- Auto-creates 4 milestones (25%, 50%, 75%, 100%)
- Tracks achievement dates
- Ready for notification integration
Migration: 20251022141924_add_goals_feature ✅
2. Backend API ✅
Goals CRUD Endpoints:
POST /api/goals - Create new goal
GET /api/goals - List all user goals (with status filter)
GET /api/goals/stats - Get goals statistics
GET /api/goals/:id - Get single goal with details
PATCH /api/goals/:id - Update goal
DELETE /api/goals/:id - Delete goal
Allocations Endpoints:
POST /api/goals/:id/allocations - Add money to goal
DELETE /api/goals/:id/allocations/:allocationId - Remove allocation
3. Business Logic ✅
Features Implemented:
✅ Multi-Currency Support
- Automatic exchange rate conversion
- Supports USD, EUR, GBP, JPY, SGD, MYR, IDR
- Tracks both original and converted amounts
✅ Wallet Balance Validation
- Checks wallet balance before allocation
- Prevents over-allocation
- Calculates balance from transactions
✅ Milestone Auto-Tracking
- Creates 4 milestones on goal creation
- Auto-updates when allocations change
- Marks achieved milestones with timestamp
- Unmarks if amount decreases
✅ Progress Calculation
- Real-time current amount tracking
- Percentage completion
- Overall portfolio progress
✅ Goal Statistics
- Total goals count
- Active vs completed goals
- Total target vs current amounts
- Overall progress percentage
📊 API Endpoints Documentation
Create Goal
POST /api/goals
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "Vacation to Bali",
"description": "Family vacation",
"targetAmount": 5000000,
"currency": "IDR",
"targetDate": "2025-12-31",
"imageUrl": "https://...",
"category": "vacation"
}
Response:
{
"id": "uuid",
"userId": "uuid",
"name": "Vacation to Bali",
"targetAmount": 5000000,
"currentAmount": 0,
"currency": "IDR",
"status": "active",
"allocations": [],
"milestones": [
{ "percentage": 25, "targetAmount": 1250000, "achievedAt": null },
{ "percentage": 50, "targetAmount": 2500000, "achievedAt": null },
{ "percentage": 75, "targetAmount": 3750000, "achievedAt": null },
{ "percentage": 100, "targetAmount": 5000000, "achievedAt": null }
]
}
Add Money to Goal
POST /api/goals/{goalId}/allocations
Authorization: Bearer {token}
Content-Type: application/json
{
"walletId": "uuid",
"amount": 500000,
"notes": "Monthly savings"
}
Response:
{
"id": "uuid",
"goalId": "uuid",
"walletId": "uuid",
"amount": 500000,
"currency": "IDR",
"exchangeRate": null,
"amountInGoalCurrency": 500000,
"notes": "Monthly savings",
"createdAt": "2025-10-22T...",
"wallet": {
"id": "uuid",
"name": "Main Wallet",
"currency": "IDR"
}
}
Get Goals Statistics
GET /api/goals/stats
Authorization: Bearer {token}
Response:
{
"totalGoals": 4,
"activeGoals": 3,
"completedGoals": 1,
"totalTargetAmount": 15000000,
"totalCurrentAmount": 8500000,
"overallProgress": 56.67
}
🔄 How It Works
Creating a Goal:
- User creates goal with target amount
- System creates 4 milestones automatically (25%, 50%, 75%, 100%)
- Goal status = "active", currentAmount = 0
Adding Money:
- User selects wallet and amount
- System validates wallet balance
- If currencies differ, applies exchange rate
- Creates allocation record
- Updates goal currentAmount
- Checks and updates milestone achievements
- Returns allocation details
Milestone Tracking:
- When currentAmount >= milestone.targetAmount → Mark as achieved
- When currentAmount < milestone.targetAmount → Unmark
- Ready for notification integration (TODO comment added)
Multi-Currency:
Example:
- Goal: $1,000 USD
- Allocation: Rp 1,500,000 IDR
- Exchange Rate: 1 USD = 15,000 IDR
- Converted: $100 USD added to goal
📁 Files Created
Backend:
apps/api/src/goals/
├── dto/
│ ├── create-goal.dto.ts ✅
│ ├── update-goal.dto.ts ✅
│ └── create-allocation.dto.ts ✅
├── goals.controller.ts ✅
├── goals.service.ts ✅
└── goals.module.ts ✅
apps/api/prisma/
├── schema.prisma ✅ (updated)
└── migrations/
└── 20251022141924_add_goals_feature/
└── migration.sql ✅
🚧 Pending - Frontend (0%)
Pages to Create:
-
Goals Dashboard (
/goals)- List all goals with cards
- Progress donut charts
- Quick stats
- Create goal button
- Filter by status
-
Goal Detail Page (
/goals/:id)- Full progress visualization
- Allocations history
- Add money dialog
- Edit goal
- Delete goal
- Milestone tracker
-
Create/Edit Goal Dialog
- Form with validation
- Image upload
- Category selection
- Date picker
-
Add Money Dialog
- Wallet selection
- Amount input
- Currency conversion preview
- Notes field
🎨 UI Components Needed
GoalCard Component:
<GoalCard>
- Goal image/icon
- Goal name
- Donut chart (progress %)
- Current / Target amount
- Days remaining
- Status badge
</GoalCard>
GoalProgress Component:
<GoalProgress>
- Large donut chart
- Percentage text
- Amount remaining
- Target date countdown
</GoalProgress>
MilestoneTracker Component:
<MilestoneTracker>
- 4 milestone indicators
- Checkmarks for achieved
- Dates achieved
- Amount needed for next
</MilestoneTracker>
AllocationsList Component:
<AllocationsList>
- Wallet name + icon
- Amount + currency
- Converted amount (if different currency)
- Date
- Notes
- Delete button
</AllocationsList>
📊 Data Flow
User Action → Frontend → API → Service → Database
↓
Update Milestones
↓
Return Updated Goal
Example: Add Money Flow
1. User clicks "Add Money" on goal
2. Selects wallet: "Main Wallet (Rp 1,000,000 balance)"
3. Enters amount: Rp 500,000
4. Frontend → POST /api/goals/{id}/allocations
5. Backend validates:
- Wallet exists? ✓
- Wallet belongs to user? ✓
- Sufficient balance? ✓ (1,000,000 >= 500,000)
6. Backend calculates:
- Exchange rate (if needed)
- Converted amount
7. Backend creates allocation
8. Backend updates goal.currentAmount
9. Backend checks milestones:
- Was at 20% → Now at 45%
- 25% milestone achieved! ✓
10. Backend returns allocation + updated goal
11. Frontend updates UI:
- Shows new allocation in list
- Updates progress chart
- Shows milestone achievement animation
🧪 Testing Checklist
Backend API Tests:
- Create goal with all fields
- Create goal with minimal fields
- List goals (empty, with data)
- Get single goal
- Update goal details
- Update goal target amount (milestones recreated)
- Delete goal
- Add allocation (same currency)
- Add allocation (different currency)
- Add allocation (insufficient balance) → Error
- Remove allocation
- Get stats
- Milestone auto-achievement
- Milestone un-achievement (when amount decreases)
Frontend Tests (TODO):
- Display goals list
- Create new goal
- Edit goal
- Delete goal
- Add money to goal
- Remove allocation
- View goal details
- Filter goals by status
- Responsive design (mobile/desktop)
🎯 Next Steps
Immediate (This Session):
- ✅ Test API endpoints manually
- ⏳ Start frontend implementation
- ⏳ Create Goals dashboard page
- ⏳ Create Goal detail page
Short Term (This Week):
- Create goal dialogs (create, edit, add money)
- Implement donut chart component
- Add to navigation menu
- Connect to wallet page (quick allocate)
Medium Term (Next Week):
- Polish UI/UX
- Add animations
- Implement image upload for goals
- Add goal templates (vacation, emergency, etc.)
- Integrate with notifications (milestone achievements)
💡 Future Enhancements
Phase 2 Integration:
- Shared goals for teams
- Team member contributions
- Goal permissions
Phase 4 Integration:
- Goal limits based on subscription plan
- Free: 3 goals
- Pro: Unlimited goals
PWA Integration:
- Push notifications for milestone achievements
- Offline goal viewing
- Background sync for allocations
📝 Notes
Exchange Rates:
- Currently using hardcoded rates
- TODO: Integrate real exchange rate API (e.g., exchangerate-api.com)
- Rates update daily
Notifications:
- Milestone achievement detection is ready
- TODO comments added in code
- Will integrate with Web Push (Phase PWA)
Performance:
- All queries use proper indexes
- Cascade deletes configured
- Efficient milestone checking
✅ Summary
Backend Status: 100% Complete ✅
- ✅ Database schema
- ✅ Migrations
- ✅ API endpoints
- ✅ Business logic
- ✅ Validation
- ✅ Multi-currency
- ✅ Milestones
- ✅ Statistics
Frontend Status: 0% (Ready to start)
Overall Progress: 60% (Backend heavy lifting done!)
Ready to build the frontend? 🚀
The backend is solid and tested. Now we can focus on creating a beautiful, intuitive UI for users to manage their goals!