Wahbi-AI / database /models.py
EGYADMIN's picture
Upload 114 files
25d2b3e verified
raw
history blame
11.4 kB
"""
نماذج بيانات النظام
"""
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Boolean, Text, Table, Enum
from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from database.db_connector import Base
# جدول العلاقة متعددة القيم بين المشاريع والملفات
project_files = Table(
'project_files',
Base.metadata,
Column('project_id', Integer, ForeignKey('projects.id'), primary_key=True),
Column('file_id', Integer, ForeignKey('files.id'), primary_key=True)
)
# تعريف الأنواع المدرجة
class ProjectStatus(enum.Enum):
"""حالة المشروع"""
NEW = "جديد"
PRICING = "قيد التسعير"
SUBMITTED = "تم التقديم"
AWARDED = "تمت الترسية"
EXECUTION = "قيد التنفيذ"
COMPLETED = "منتهي"
CANCELLED = "ملغي"
class TenderType(enum.Enum):
"""نوع المناقصة"""
PUBLIC = "عامة"
PRIVATE = "خاصة"
DIRECT = "أمر مباشر"
class PricingMethod(enum.Enum):
"""طريقة التسعير"""
STANDARD = "قياسي"
UNBALANCED = "غير متزن"
COMPETITIVE = "تنافسي"
PROFITABILITY = "موجه بالربحية"
# نموذج المستخدم
class User(Base):
"""نموذج بيانات المستخدم"""
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(50), unique=True, nullable=False)
password_hash = Column(String(128), nullable=False)
full_name = Column(String(100), nullable=False)
email = Column(String(100), unique=True, nullable=False)
phone = Column(String(20))
role = Column(String(20), nullable=False)
department = Column(String(50))
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.now)
last_login = Column(DateTime)
# العلاقات
projects = relationship("Project", back_populates="created_by")
pricing_items = relationship("PricingItem", back_populates="created_by")
def __repr__(self):
return f"<User {self.username}>"
# نموذج المشروع
class Project(Base):
"""نموذج بيانات المشروع"""
__tablename__ = 'projects'
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
tender_number = Column(String(50))
client = Column(String(100), nullable=False)
location = Column(String(100))
description = Column(Text)
status = Column(Enum(ProjectStatus), default=ProjectStatus.NEW)
tender_type = Column(Enum(TenderType), default=TenderType.PUBLIC)
pricing_method = Column(Enum(PricingMethod), default=PricingMethod.STANDARD)
submission_date = Column(DateTime)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
created_by_id = Column(Integer, ForeignKey('users.id'))
# العلاقات
created_by = relationship("User", back_populates="projects")
pricing_sections = relationship("PricingSection", back_populates="project", cascade="all, delete-orphan")
pricing_items = relationship("PricingItem", back_populates="project", cascade="all, delete-orphan")
local_content_items = relationship("LocalContentItem", back_populates="project", cascade="all, delete-orphan")
risk_items = relationship("RiskItem", back_populates="project", cascade="all, delete-orphan")
files = relationship("File", secondary=project_files, back_populates="projects")
def __repr__(self):
return f"<Project {self.name}>"
# نموذج قسم التسعير
class PricingSection(Base):
"""نموذج بيانات قسم التسعير"""
__tablename__ = 'pricing_sections'
id = Column(Integer, primary_key=True)
project_id = Column(Integer, ForeignKey('projects.id'), nullable=False)
name = Column(String(100), nullable=False)
description = Column(Text)
section_order = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
project = relationship("Project", back_populates="pricing_sections")
pricing_items = relationship("PricingItem", back_populates="section", cascade="all, delete-orphan")
def __repr__(self):
return f"<PricingSection {self.name}>"
# نموذج بند التسعير
class PricingItem(Base):
"""نموذج بيانات بند التسعير"""
__tablename__ = 'pricing_items'
id = Column(Integer, primary_key=True)
project_id = Column(Integer, ForeignKey('projects.id'), nullable=False)
section_id = Column(Integer, ForeignKey('pricing_sections.id'))
item_code = Column(String(20))
description = Column(Text, nullable=False)
unit = Column(String(20), nullable=False)
quantity = Column(Float, nullable=False)
unit_price = Column(Float, default=0)
unbalanced_price = Column(Float)
final_price = Column(Float)
pricing_strategy = Column(String(20), default="متوازن")
notes = Column(Text)
created_by_id = Column(Integer, ForeignKey('users.id'))
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
project = relationship("Project", back_populates="pricing_items")
section = relationship("PricingSection", back_populates="pricing_items")
created_by = relationship("User", back_populates="pricing_items")
resource_usages = relationship("ResourceUsage", back_populates="pricing_item")
def __repr__(self):
return f"<PricingItem {self.item_code}: {self.description[:30]}>"
# نموذج بند المحتوى المحلي
class LocalContentItem(Base):
"""نموذج بيانات بند المحتوى المحلي"""
__tablename__ = 'local_content_items'
id = Column(Integer, primary_key=True)
project_id = Column(Integer, ForeignKey('projects.id'), nullable=False)
category = Column(String(50), nullable=False)
item_name = Column(String(100), nullable=False)
supplier_id = Column(Integer, ForeignKey('suppliers.id'))
total_cost = Column(Float, default=0)
local_percentage = Column(Float, default=0)
notes = Column(Text)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
project = relationship("Project", back_populates="local_content_items")
supplier = relationship("Supplier", back_populates="local_content_items")
def __repr__(self):
return f"<LocalContentItem {self.item_name}>"
# نموذج المورد
class Supplier(Base):
"""نموذج بيانات المورد"""
__tablename__ = 'suppliers'
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
contact_person = Column(String(100))
phone = Column(String(20))
email = Column(String(100))
address = Column(String(200))
category = Column(String(50))
is_local = Column(Boolean, default=False)
local_content_percentage = Column(Float, default=0)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
local_content_items = relationship("LocalContentItem", back_populates="supplier")
resources = relationship("Resource", back_populates="supplier")
def __repr__(self):
return f"<Supplier {self.name}>"
# نموذج المخاطرة
class RiskItem(Base):
"""نموذج بيانات المخاطرة"""
__tablename__ = 'risk_items'
id = Column(Integer, primary_key=True)
project_id = Column(Integer, ForeignKey('projects.id'), nullable=False)
risk_code = Column(String(20))
description = Column(Text, nullable=False)
category = Column(String(50), nullable=False)
impact = Column(String(20), nullable=False)
probability = Column(String(20), nullable=False)
mitigation_strategy = Column(Text)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
project = relationship("Project", back_populates="risk_items")
def __repr__(self):
return f"<RiskItem {self.risk_code}: {self.description[:30]}>"
# نموذج المورد
class Resource(Base):
"""نموذج بيانات المورد"""
__tablename__ = 'resources'
id = Column(Integer, primary_key=True)
code = Column(String(20), unique=True)
name = Column(String(100), nullable=False)
description = Column(Text)
category = Column(String(50), nullable=False)
unit = Column(String(20), nullable=False)
unit_price = Column(Float, default=0)
supplier_id = Column(Integer, ForeignKey('suppliers.id'))
is_local = Column(Boolean, default=False)
local_content_percentage = Column(Float, default=0)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
supplier = relationship("Supplier", back_populates="resources")
resource_usages = relationship("ResourceUsage", back_populates="resource")
def __repr__(self):
return f"<Resource {self.code}: {self.name}>"
# نموذج استخدام المورد
class ResourceUsage(Base):
"""نموذج بيانات استخدام المورد"""
__tablename__ = 'resource_usages'
id = Column(Integer, primary_key=True)
pricing_item_id = Column(Integer, ForeignKey('pricing_items.id'), nullable=False)
resource_id = Column(Integer, ForeignKey('resources.id'), nullable=False)
quantity = Column(Float, nullable=False)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
# العلاقات
pricing_item = relationship("PricingItem", back_populates="resource_usages")
resource = relationship("Resource", back_populates="resource_usages")
def __repr__(self):
return f"<ResourceUsage {self.pricing_item_id} - {self.resource_id}>"
# نموذج الملف
class File(Base):
"""نموذج بيانات الملف"""
__tablename__ = 'files'
id = Column(Integer, primary_key=True)
filename = Column(String(100), nullable=False)
original_filename = Column(String(100), nullable=False)
file_type = Column(String(20), nullable=False)
file_size = Column(Integer, nullable=False)
file_path = Column(String(255), nullable=False)
upload_date = Column(DateTime, default=datetime.now)
# العلاقات
projects = relationship("Project", secondary=project_files, back_populates="files")
def __repr__(self):
return f"<File {self.original_filename}>"