from sqlalchemy import Column, Integer, Float, String, DateTime, Boolean, JSON, ForeignKey, Enum as SQLEnum from sqlalchemy.orm import relationship, backref from datetime import datetime from sqlalchemy.ext.declarative import declarative_base from database import Base class Subscription(Base): __tablename__ = "subscriptions" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) plan_name = Column(String) # 구독 플랜 이름 start_time = Column(DateTime) # 구독 시작 시간 end_time = Column(DateTime, nullable=True) # 구독 종료 시간 billing_key = Column(String) # 결제 키 schedule_id = Column(String) # 스케줄 ID issue_id = Column(String) # 이슈 ID customer_id = Column(String) # 고객 ID billing_method = Column(String, nullable = True) # 결제 수단, billing_key와 역할이 겹칠수도 있긴함 billing_cycle = Column(String, nullable = True) # 결제 주기. year or month next_billing_time = Column(DateTime, nullable=True) # 다음 결제 시간 #같은 일자이고, 없는 경우 말일 is_active = Column(Boolean, default=True) # 구독 활성 상태 deleted = Column(Boolean, default = False) user = relationship("User", back_populates="subscriptions") def __repr__(self): return f"" class Payment(Base): __tablename__ = "payments" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) subscription_id = Column(Integer, ForeignKey('subscriptions.id'), nullable=False) portone_tx_id = Column(String) # 포트원 주문번호(트랜잭션 ID) amount = Column(Float) # 결제 금액 currency = Column(String) # 결제 통화 dollar_amount = Column(Float) # Scale 적용없는, 진짜 달러 payment_time = Column(DateTime, default=datetime.utcnow) # 결제 날짜 payment_method = Column(String) # 결제 방법 payment_id = Column(String) # 결제 ID issue_id = Column(String) receipt_url = Column(String) # 영수증 URL status = Column(String) # 결제 상태 user = relationship("User", back_populates="payments") subscription = relationship("Subscription", backref=backref("payments", cascade="all, delete-orphan")) deleted = Column(Boolean, default = False) payment_number = Column(String, unique=True) # 결제 번호 def __repr__(self): return f"" def generate_payment_number(self): print(self.payment_time) unique_string = f"{self.payment_time.strftime('%Y%m%d')}{self.user_id}{self.id:010d}" return unique_string class Billing_Key(Base): __tablename__ = "billing_keys" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) billing_key = Column(String) # 결제 키 deleted = Column(Boolean, default = False) requested_at = Column(DateTime, default=datetime.utcnow) # 요청 날짜 payment_method = Column(String) # toss payments or paypal billing_key_json = Column(JSON) def __repr__(self): return f"" class Exchange_Rate(Base): __tablename__ = "exchange_rates" id = Column(Integer, primary_key=True, index=True) currency = Column(String) # 통화 rate = Column(Float) # 환율 updated_at = Column(DateTime, default=datetime.utcnow) # 업데이트 날짜 def __repr__(self): return f""