File size: 3,492 Bytes
8223b74 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Text, LargeBinary
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from .database import Base
class LaborRate(Base):
"""Model for labor rates by job type"""
__tablename__ = "labor_rates"
id = Column(Integer, primary_key=True, index=True)
job_type = Column(String, unique=True, index=True, nullable=False)
hourly_rate = Column(Float, nullable=False)
currency = Column(String, default="TRY")
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
def __repr__(self):
return f"<LaborRate(job_type='{self.job_type}', hourly_rate={self.hourly_rate})>"
class Material(Base):
"""Model for materials and their unit prices"""
__tablename__ = "materials"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True, nullable=False)
unit = Column(String, nullable=False) # e.g., kg, meter, piece
unit_price = Column(Float, nullable=False)
currency = Column(String, default="TRY")
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
def __repr__(self):
return f"<Material(name='{self.name}', unit='{self.unit}', unit_price={self.unit_price})>"
class MarginProfile(Base):
"""Model for margin profiles by project type"""
__tablename__ = "margin_profiles"
id = Column(Integer, primary_key=True, index=True)
profile_name = Column(String, unique=True, index=True, nullable=False)
margin_percentage = Column(Float, nullable=False) # Stored as decimal (e.g., 0.15 for 15%)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
def __repr__(self):
return f"<MarginProfile(profile_name='{self.profile_name}', margin_percentage={self.margin_percentage})>"
class ChatHistory(Base):
"""Model for storing chat history"""
__tablename__ = "chat_history"
id = Column(Integer, primary_key=True, index=True)
user_input = Column(String, nullable=False)
assistant_response = Column(String, nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
def __repr__(self):
return f"<ChatHistory(id={self.id}, created_at={self.created_at})>"
class Document(Base):
"""Model for storing uploaded documents"""
__tablename__ = "documents"
id = Column(Integer, primary_key=True, index=True)
filename = Column(String, nullable=False)
content_type = Column(String, nullable=False)
file_path = Column(String, nullable=False) # Path to stored file
file_size = Column(Integer, nullable=False) # Size in bytes
content_text = Column(Text, nullable=True) # Extracted text content
analysis_result = Column(Text, nullable=True) # Analysis results in JSON format
document_type = Column(String, nullable=True) # Type of document (uploaded, generated)
template_type = Column(String, nullable=True) # Template type for generated documents
uploaded_at = Column(DateTime(timezone=True), server_default=func.now())
analyzed_at = Column(DateTime(timezone=True), nullable=True)
def __repr__(self):
return f"<Document(id={self.id}, filename='{self.filename}', uploaded_at={self.uploaded_at})>" |