61 lines
2.4 KiB
Python
61 lines
2.4 KiB
Python
from datetime import date
|
|
from sqlalchemy import Column, Date, ForeignKey, Integer, Numeric, String, Text, Enum
|
|
from sqlalchemy.orm import relationship
|
|
import enum
|
|
|
|
from app.db.session import Base
|
|
from app.models.base import Base as CustomBase
|
|
|
|
|
|
class InvoiceStatus(str, enum.Enum):
|
|
"""Enum for invoice statuses."""
|
|
DRAFT = "draft"
|
|
SENT = "sent"
|
|
PAID = "paid"
|
|
OVERDUE = "overdue"
|
|
CANCELLED = "cancelled"
|
|
|
|
|
|
class Invoice(Base, CustomBase):
|
|
"""Invoice model for managing invoices."""
|
|
|
|
invoice_number = Column(String(50), nullable=False, index=True)
|
|
status = Column(Enum(InvoiceStatus), default=InvoiceStatus.DRAFT)
|
|
issue_date = Column(Date, nullable=False, default=date.today)
|
|
due_date = Column(Date, nullable=False)
|
|
subtotal = Column(Numeric(10, 2), nullable=False, default=0.00)
|
|
tax_amount = Column(Numeric(10, 2), nullable=False, default=0.00)
|
|
discount = Column(Numeric(10, 2), nullable=False, default=0.00)
|
|
total = Column(Numeric(10, 2), nullable=False, default=0.00)
|
|
notes = Column(Text, nullable=True)
|
|
terms = Column(Text, nullable=True)
|
|
|
|
# Foreign keys
|
|
user_id = Column(Integer, ForeignKey("user.id"), nullable=False)
|
|
customer_id = Column(Integer, ForeignKey("customer.id"), nullable=False)
|
|
|
|
# Relationships
|
|
user = relationship("User", back_populates="invoices")
|
|
customer = relationship("Customer", back_populates="invoices")
|
|
items = relationship("InvoiceItem", back_populates="invoice", cascade="all, delete-orphan")
|
|
payments = relationship("Payment", back_populates="invoice", cascade="all, delete-orphan")
|
|
|
|
|
|
class InvoiceItem(Base, CustomBase):
|
|
"""Model for items within an invoice."""
|
|
|
|
description = Column(String(255), nullable=False)
|
|
quantity = Column(Numeric(10, 2), nullable=False, default=1.00)
|
|
unit_price = Column(Numeric(10, 2), nullable=False)
|
|
tax_rate = Column(Numeric(5, 2), nullable=False, default=0.00)
|
|
tax_amount = Column(Numeric(10, 2), nullable=False, default=0.00)
|
|
subtotal = Column(Numeric(10, 2), nullable=False)
|
|
total = Column(Numeric(10, 2), nullable=False)
|
|
|
|
# Foreign keys
|
|
invoice_id = Column(Integer, ForeignKey("invoice.id"), nullable=False)
|
|
product_id = Column(Integer, ForeignKey("product.id"), nullable=True)
|
|
|
|
# Relationships
|
|
invoice = relationship("Invoice", back_populates="items")
|
|
product = relationship("Product", back_populates="invoice_items") |