init commit
This commit is contained in:
50
app/db/repositories/goal.py
Normal file
50
app/db/repositories/goal.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""Goal repository"""
|
||||
|
||||
from typing import List, Optional
|
||||
from sqlalchemy.orm import Session
|
||||
from app.db.models import Goal
|
||||
from app.db.repositories.base import BaseRepository
|
||||
|
||||
|
||||
class GoalRepository(BaseRepository[Goal]):
|
||||
"""Goal data access operations"""
|
||||
|
||||
def __init__(self, session: Session):
|
||||
super().__init__(session, Goal)
|
||||
|
||||
def get_family_goals(self, family_id: int) -> List[Goal]:
|
||||
"""Get all active goals for family"""
|
||||
return (
|
||||
self.session.query(Goal)
|
||||
.filter(Goal.family_id == family_id, Goal.is_active == True)
|
||||
.order_by(Goal.priority.desc())
|
||||
.all()
|
||||
)
|
||||
|
||||
def get_goals_progress(self, family_id: int) -> List[dict]:
|
||||
"""Get goals with progress info"""
|
||||
goals = self.get_family_goals(family_id)
|
||||
return [
|
||||
{
|
||||
"id": goal.id,
|
||||
"name": goal.name,
|
||||
"target": goal.target_amount,
|
||||
"current": goal.current_amount,
|
||||
"progress_percent": (goal.current_amount / goal.target_amount * 100) if goal.target_amount > 0 else 0,
|
||||
"is_completed": goal.is_completed
|
||||
}
|
||||
for goal in goals
|
||||
]
|
||||
|
||||
def update_progress(self, goal_id: int, amount: float) -> Optional[Goal]:
|
||||
"""Update goal progress"""
|
||||
goal = self.get_by_id(goal_id)
|
||||
if goal:
|
||||
goal.current_amount += amount
|
||||
if goal.current_amount >= goal.target_amount:
|
||||
goal.is_completed = True
|
||||
from datetime import datetime
|
||||
goal.completed_at = datetime.utcnow()
|
||||
self.session.commit()
|
||||
self.session.refresh(goal)
|
||||
return goal
|
||||
Reference in New Issue
Block a user