Sami Marreed
feat: docker-v1 with optimized frontend
0646b18
Raw
History Blame Contribute Delete
3.63 kB
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Text, Boolean
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from crm_api.database import Base
class Account(Base):
__tablename__ = "accounts"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255), nullable=False, index=True)
industry = Column(String(100), nullable=True)
website = Column(String(255), nullable=True)
phone = Column(String(50), nullable=True)
# email = Column(String(255), nullable=True)
address = Column(Text, nullable=True)
city = Column(String(100), nullable=True)
state = Column(String(100), nullable=True)
country = Column(String(100), nullable=True)
region = Column(String(50), nullable=True, index=True)
annual_revenue = Column(Float, nullable=True)
employee_count = Column(Integer, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
contacts = relationship("Contact", back_populates="account")
opportunities = relationship("Opportunity", back_populates="account")
class Lead(Base):
__tablename__ = "leads"
id = Column(Integer, primary_key=True, index=True)
first_name = Column(String(100), nullable=False)
last_name = Column(String(100), nullable=False)
email = Column(String(255), nullable=False, index=True)
phone = Column(String(50), nullable=True)
company = Column(String(255), nullable=True)
job_title = Column(String(100), nullable=True)
industry = Column(String(100), nullable=True)
source = Column(String(100), nullable=True)
status = Column(String(50), nullable=True, default="new")
score = Column(Integer, nullable=True, default=0)
notes = Column(Text, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
class Contact(Base):
__tablename__ = "contacts"
id = Column(Integer, primary_key=True, index=True)
first_name = Column(String(100), nullable=False)
last_name = Column(String(100), nullable=False)
email = Column(String(255), nullable=False, index=True)
phone = Column(String(50), nullable=True)
job_title = Column(String(100), nullable=True)
department = Column(String(100), nullable=True)
is_primary = Column(Boolean, default=False)
account_id = Column(Integer, ForeignKey("accounts.id"), nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
account = relationship("Account", back_populates="contacts")
class Opportunity(Base):
__tablename__ = "opportunities"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
value = Column(Float, nullable=False)
currency = Column(String(3), default="USD")
stage = Column(String(50), nullable=True, default="prospecting")
probability = Column(Float, nullable=True, default=0.0) # 0.0 to 1.0
close_date = Column(DateTime(timezone=True), nullable=True)
account_id = Column(Integer, ForeignKey("accounts.id"), nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
account = relationship("Account", back_populates="opportunities")