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.
172 lines
6.9 KiB
Python
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())
|