| from datetime import datetime, timedelta |
| from sqlalchemy import Column, String, Integer, Float, Boolean, DateTime, ForeignKey, UniqueConstraint, Index |
| from sqlalchemy.orm import declarative_base |
|
|
| Base = declarative_base() |
|
|
|
|
| class Company(Base): |
| """์์ฅ์ฌ ๊ธฐ๋ณธ ์ ๋ณด. ์ฐ์ ์ฃผ๋ ์์ง ์ skip.""" |
| __tablename__ = "company" |
|
|
| ticker = Column(String, primary_key=True) |
| corp_code = Column(String) |
| name = Column(String, nullable=False) |
| market = Column(String) |
| fiscal_year_end = Column(Integer, default=12) |
|
|
|
|
| class PriceSnapshot(Base): |
| """ํ์ฌ ์ฃผ๊ฐ + ์๊ฐ์ด์ก. ๋ค์ด๋ฒ ์ปจ์ผ์์ค ์์ง ์ ํจ๊ป ์ ์ฅ.""" |
| __tablename__ = "price_snapshot" |
|
|
| ticker = Column(String, ForeignKey("company.ticker"), primary_key=True) |
| current_price = Column(Float) |
| market_cap = Column(Float) |
| updated_at = Column(DateTime) |
|
|
|
|
| class AnnualData(Base): |
| """์ฐ๊ฐ ์ฌ๋ฌด ๋ฐ์ดํฐ. ํ์ ์ค์ (is_estimate=False)๊ณผ ์ปจ์ผ์์ค(is_estimate=True) ํตํฉ.""" |
| __tablename__ = "annual_data" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| ticker = Column(String, ForeignKey("company.ticker"), nullable=False) |
| year = Column(Integer, nullable=False) |
| is_estimate = Column(Boolean, nullable=False, default=False) |
|
|
| |
| revenue = Column(Float) |
| op_income = Column(Float) |
| net_income = Column(Float) |
|
|
| |
| eps = Column(Float) |
| bps = Column(Float) |
| dividend_per_share = Column(Float) |
| dividend_yield = Column(Float) |
|
|
| |
| equity = Column(Float) |
| total_assets = Column(Float) |
| shares_outstanding = Column(Float) |
|
|
| |
| roe = Column(Float) |
| roa = Column(Float) |
| debt_ratio = Column(Float) |
| interest_bearing_debt = Column(Float) |
|
|
| |
| is_stale = Column(Boolean, default=False) |
| updated_at = Column(DateTime) |
|
|
| __table_args__ = ( |
| Index("ix_annual_data_ticker_year_is_estimate", "ticker", "year", "is_estimate"), |
| Index("ix_annual_data_ticker_is_estimate", "ticker", "is_estimate"), |
| ) |
|
|
|
|
| class User(Base): |
| """Google OAuth ๋ก๊ทธ์ธ ์ฌ์ฉ์.""" |
| __tablename__ = "user" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| google_id = Column(String, unique=True, nullable=False) |
| email = Column(String, nullable=False) |
| name = Column(String) |
| is_admin = Column(Boolean, default=False) |
| created_at = Column(DateTime, default=lambda: datetime.utcnow() + timedelta(hours=9)) |
|
|
|
|
| class Watchlist(Base): |
| """๊ด์ฌ์ข
๋ชฉ. ์ฌ์ฉ์๋ณ ๊ฒฉ๋ฆฌ.""" |
| __tablename__ = "watchlist" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| user_id = Column(Integer, ForeignKey("user.id"), nullable=False) |
| ticker = Column(String, ForeignKey("company.ticker"), nullable=False) |
| added_at = Column(DateTime, default=lambda: datetime.utcnow() + timedelta(hours=9)) |
| memo = Column(String, default="") |
|
|
| __table_args__ = (UniqueConstraint("user_id", "ticker"),) |
|
|
|
|
| class BondRate(Base): |
| """๊ตญ์ฑ 10๋
๋ฌผ ๊ธ๋ฆฌ. ๋จ์ผ row (id=1) upsert.""" |
| __tablename__ = "bond_rate" |
|
|
| id = Column(Integer, primary_key=True, default=1) |
| rate = Column(Float, nullable=False) |
| fetched_at = Column(DateTime) |
|
|
|
|
| class Feedback(Base): |
| """์ฌ์ฉ์ ํผ๋๋ฐฑ/๋๊ธ.""" |
| __tablename__ = "feedback" |
|
|
| id = Column(Integer, primary_key=True, autoincrement=True) |
| user_id = Column(Integer, ForeignKey("user.id"), nullable=False) |
| content = Column(String, nullable=False) |
| created_at = Column(DateTime, default=lambda: datetime.utcnow() + timedelta(hours=9)) |
|
|