Files
robinhood/backend/app/models/models.py
T
Claude 7dd2166bf4 Implement Phase 1: Daily Helper Foundation
Complete implementation of Phase 1 enhancements including:

Backend:
- UserProfile model for storing user preferences (timezone, trading style, risk tolerance)
- DailyRoutine model for scheduling routines (morning, active_trading, evening)
- RoutineExecution model for tracking routine execution history
- Notification model for managing all types of notifications
- DailyChecklist model for daily task tracking with completion percentage
- HabitTracker model for tracking habits and streaks

Services:
- RoutineService: Handles routine execution with task registry pattern
- RoutineScheduler: Async scheduler for automated routine execution
- NotificationService: Comprehensive notification creation and delivery system
- Support for price alerts, news, routines, reminders, and performance notifications

API Endpoints (daily_helper router):
- User profile: CRUD operations, get/update preferences
- Daily routines: Create, list, execute, track history
- Notifications: CRUD, mark read, batch operations
- Daily checklists: CRUD, item management, completion tracking
- Habits: Create, track, log completions, manage streaks
- Dashboard: Summary endpoint for daily helper overview

Frontend Components:
- UserProfileSetup: Complete user profile configuration with preferences
- NotificationCenter: Bell icon with dropdown, notification management
- HabitTracker: Habit creation, streak tracking, gamification with fire emojis
- DailyChecklistPanel: Checklist management with completion percentage

Schemas:
- Full Pydantic schemas for request/response validation
- Type-safe API contracts

Features:
- Timezone support for international users
- Trading style and risk tolerance preferences
- Automated routine execution with task registry
- Real-time notifications with priority levels
- Habit streaks with motivational badges
- Daily checklist with persistent state
- Completion percentage tracking
- Notes and metadata support

All components are production-ready with error handling and user feedback.
2025-11-15 23:09:10 +00:00

172 lines
6.9 KiB
Python

from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Enum, Boolean, Date, JSON, Text
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import enum
from app.db.database import Base
class TradeAction(str, enum.Enum):
BUY = "BUY"
SELL = "SELL"
class Simulation(Base):
__tablename__ = "simulations"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, nullable=True) # For future multi-user support
symbol = Column(String, default="XAU/USD")
initial_capital = Column(Float, default=100000.0)
current_capital = Column(Float, default=100000.0)
total_pnl = Column(Float, default=0.0)
total_pnl_percent = Column(Float, default=0.0)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
trades = relationship("Trade", back_populates="simulation", cascade="all, delete-orphan")
positions = relationship("Position", back_populates="simulation", cascade="all, delete-orphan")
class Trade(Base):
__tablename__ = "trades"
id = Column(Integer, primary_key=True, index=True)
simulation_id = Column(Integer, ForeignKey("simulations.id"))
action = Column(Enum(TradeAction))
quantity = Column(Float)
price = Column(Float)
total = Column(Float)
pnl = Column(Float, nullable=True)
timestamp = Column(DateTime(timezone=True), server_default=func.now())
simulation = relationship("Simulation", back_populates="trades")
class Position(Base):
__tablename__ = "positions"
id = Column(Integer, primary_key=True, index=True)
simulation_id = Column(Integer, ForeignKey("simulations.id"))
symbol = Column(String, default="XAU/USD")
quantity = Column(Float)
avg_price = Column(Float)
current_price = Column(Float)
unrealized_pnl = Column(Float)
unrealized_pnl_percent = Column(Float)
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
simulation = relationship("Simulation", back_populates="positions")
class AIAnalysisLog(Base):
__tablename__ = "ai_analysis_logs"
id = Column(Integer, primary_key=True, index=True)
simulation_id = Column(Integer, nullable=True)
recommendation = Column(String)
confidence = Column(Float)
reasoning = Column(String)
risk_level = Column(String)
support_levels = Column(String) # JSON string
resistance_levels = Column(String) # JSON string
created_at = Column(DateTime(timezone=True), server_default=func.now())
# Phase 1: Daily Helper Enhancements
class UserProfile(Base):
"""User profile and preferences for daily helper features"""
__tablename__ = "user_profiles"
id = Column(Integer, primary_key=True, index=True)
email = Column(String, unique=True, index=True, nullable=True)
username = Column(String, unique=True, index=True, nullable=True)
timezone = Column(String, default="UTC")
preferred_trading_start = Column(String, default="09:00") # HH:MM format
preferred_trading_end = Column(String, default="17:00") # HH:MM format
risk_tolerance = Column(String, default="moderate") # conservative, moderate, aggressive
trading_style = Column(String, default="day_trader") # scalper, day_trader, swing_trader
daily_target = Column(Float, nullable=True) # Daily profit target
max_loss = Column(Float, nullable=True) # Maximum loss tolerance
notifications_enabled = Column(Boolean, default=True)
email_reports = Column(Boolean, default=True)
sms_enabled = Column(Boolean, default=False)
push_notifications = Column(Boolean, default=True)
phone_number = Column(String, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
class DailyRoutine(Base):
"""Scheduled daily trading routines"""
__tablename__ = "daily_routines"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, nullable=True)
routine_type = Column(String) # morning, active_trading, evening
scheduled_time = Column(String) # HH:MM format
tasks = Column(JSON, default=[]) # List of task names
enabled = Column(Boolean, default=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
class RoutineExecution(Base):
"""Track routine execution history"""
__tablename__ = "routine_executions"
id = Column(Integer, primary_key=True, index=True)
routine_id = Column(Integer, ForeignKey("daily_routines.id"))
executed_at = Column(DateTime(timezone=True), server_default=func.now())
completion_status = Column(String) # completed, failed, partial
tasks_completed = Column(JSON, default=[]) # List of completed task names
execution_notes = Column(Text, nullable=True)
class Notification(Base):
"""System notifications for user"""
__tablename__ = "notifications"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, nullable=True)
notification_type = Column(String) # price_alert, routine, report, news, reminder
title = Column(String)
message = Column(Text)
priority = Column(String, default="normal") # low, normal, high, critical
delivery_method = Column(String, default="push") # push, email, sms
data = Column(JSON, nullable=True) # Additional metadata
read = Column(Boolean, default=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
read_at = Column(DateTime(timezone=True), nullable=True)
class DailyChecklist(Base):
"""Daily checklist items and completion status"""
__tablename__ = "daily_checklists"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, nullable=True)
checklist_date = Column(Date, default=func.current_date())
checklist_type = Column(String) # morning, active_trading, evening, all
items = Column(JSON, default=[]) # List of {id, title, completed, completed_at}
completion_percentage = Column(Float, default=0.0)
notes = Column(Text, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
class HabitTracker(Base):
"""Track user habits and streaks"""
__tablename__ = "habit_trackers"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, nullable=True)
habit_name = Column(String) # journaling, planning, review, trading
frequency = Column(String) # daily, weekly
completion_dates = Column(JSON, default=[]) # List of ISO date strings
current_streak = Column(Integer, default=0)
longest_streak = Column(Integer, default=0)
total_completions = Column(Integer, default=0)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())