from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Float, Text, Enum from sqlalchemy.orm import relationship from datetime import datetime from enum import Enum as PyEnum from app.db.base import Base class InvoiceStatus(PyEnum): DRAFT = "draft" SENT = "sent" PAID = "paid" OVERDUE = "overdue" CANCELLED = "cancelled" class Invoice(Base): __tablename__ = "invoices" id = Column(Integer, primary_key=True, index=True) invoice_number = Column(String, unique=True, nullable=False, index=True) client_id = Column(Integer, ForeignKey("clients.id"), nullable=False) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) issue_date = Column(DateTime, default=datetime.utcnow) due_date = Column(DateTime, nullable=False) subtotal = Column(Float, default=0.0) tax_rate = Column(Float, default=0.0) tax_amount = Column(Float, default=0.0) total_amount = Column(Float, default=0.0) status = Column(Enum(InvoiceStatus), default=InvoiceStatus.DRAFT) notes = Column(Text) payment_terms = Column(String, default="Net 30") created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) client = relationship("Client", back_populates="invoices") owner = relationship("User", back_populates="invoices") items = relationship("InvoiceItem", back_populates="invoice", cascade="all, delete-orphan")