# models/database/company.py """ Company model representing the business entity that owns one or more vendor brands. A Company represents the legal/business entity with contact information, while Vendors represent the individual brands/storefronts operated by that company. """ from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Text from sqlalchemy.orm import relationship from app.core.database import Base from models.database.base import TimestampMixin class Company(Base, TimestampMixin): """ Represents a company (business entity) in the system. A company owns one or more vendor brands. All business/contact information is stored at the company level to avoid duplication. """ __tablename__ = "companies" # ======================================================================== # Basic Information # ======================================================================== id = Column(Integer, primary_key=True, index=True) """Unique identifier for the company.""" name = Column(String, nullable=False, index=True) """Company legal/business name.""" description = Column(Text) """Optional description of the company.""" # ======================================================================== # Ownership # ======================================================================== owner_user_id = Column(Integer, ForeignKey("users.id"), nullable=False) """Foreign key to the user who owns this company.""" # ======================================================================== # Contact Information # ======================================================================== contact_email = Column(String, nullable=False) """Primary business contact email.""" contact_phone = Column(String) """Business phone number.""" website = Column(String) """Company website URL.""" # ======================================================================== # Business Details # ======================================================================== business_address = Column(Text) """Physical business address.""" tax_number = Column(String) """Tax/VAT registration number.""" # ======================================================================== # Status Flags # ======================================================================== is_active = Column(Boolean, default=True, nullable=False) """Whether the company is active. Affects all associated vendors.""" is_verified = Column(Boolean, default=False, nullable=False) """Whether the company has been verified by platform admins.""" # ======================================================================== # Relationships # ======================================================================== owner = relationship("User", back_populates="owned_companies") """The user who owns this company.""" vendors = relationship( "Vendor", back_populates="company", cascade="all, delete-orphan", order_by="Vendor.name", ) """All vendor brands operated by this company.""" def __repr__(self): """String representation of the Company object.""" return f"" # ======================================================================== # Helper Properties # ======================================================================== @property def vendor_count(self) -> int: """Get the number of vendors belonging to this company.""" return len(self.vendors) if self.vendors else 0 @property def active_vendor_count(self) -> int: """Get the number of active vendors belonging to this company.""" if not self.vendors: return 0 return sum(1 for v in self.vendors if v.is_active)