|
""" |
|
نماذج البيانات لنظام إدارة المناقصات |
|
""" |
|
|
|
import sqlite3 |
|
import logging |
|
from datetime import datetime |
|
|
|
logger = logging.getLogger('tender_system.models') |
|
|
|
class User: |
|
"""نموذج المستخدم""" |
|
|
|
def __init__(self, id=None, username=None, password=None, full_name=None, email=None, role=None, status=None): |
|
"""تهيئة نموذج المستخدم""" |
|
self.id = id |
|
self.username = username |
|
self.password = password |
|
self.full_name = full_name |
|
self.email = email |
|
self.role = role |
|
self.status = status |
|
self.created_at = None |
|
self.updated_at = None |
|
|
|
@staticmethod |
|
def authenticate(username, password, db): |
|
"""مصادقة المستخدم""" |
|
try: |
|
query = "SELECT * FROM users WHERE username = ? AND password = ? AND status = 'نشط'" |
|
result = db.fetch_one(query, (username, password)) |
|
|
|
if result: |
|
user = User() |
|
user.id = result[0] |
|
user.username = result[1] |
|
user.password = result[2] |
|
user.full_name = result[3] |
|
user.email = result[4] |
|
user.role = result[5] |
|
user.status = result[6] |
|
user.created_at = result[7] |
|
user.updated_at = result[8] |
|
|
|
return user |
|
|
|
return None |
|
except Exception as e: |
|
logger.error(f"خطأ في مصادقة المستخدم: {str(e)}") |
|
return None |
|
|
|
@staticmethod |
|
def get_by_id(user_id, db): |
|
"""الحصول على المستخدم بواسطة المعرف""" |
|
try: |
|
query = "SELECT * FROM users WHERE id = ?" |
|
result = db.fetch_one(query, (user_id,)) |
|
|
|
if result: |
|
user = User() |
|
user.id = result[0] |
|
user.username = result[1] |
|
user.password = result[2] |
|
user.full_name = result[3] |
|
user.email = result[4] |
|
user.role = result[5] |
|
user.status = result[6] |
|
user.created_at = result[7] |
|
user.updated_at = result[8] |
|
|
|
return user |
|
|
|
return None |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المستخدم: {str(e)}") |
|
return None |
|
|
|
@staticmethod |
|
def get_all(db): |
|
"""الحصول على جميع المستخدمين""" |
|
try: |
|
query = "SELECT * FROM users" |
|
results = db.fetch_all(query) |
|
|
|
users = [] |
|
for result in results: |
|
user = User() |
|
user.id = result[0] |
|
user.username = result[1] |
|
user.password = result[2] |
|
user.full_name = result[3] |
|
user.email = result[4] |
|
user.role = result[5] |
|
user.status = result[6] |
|
user.created_at = result[7] |
|
user.updated_at = result[8] |
|
|
|
users.append(user) |
|
|
|
return users |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المستخدمين: {str(e)}") |
|
return [] |
|
|
|
def save(self, db): |
|
"""حفظ المستخدم""" |
|
try: |
|
if self.id: |
|
|
|
data = { |
|
'username': self.username, |
|
'password': self.password, |
|
'full_name': self.full_name, |
|
'email': self.email, |
|
'role': self.role, |
|
'status': self.status, |
|
'updated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
} |
|
|
|
db.update('users', data, f"id = {self.id}") |
|
return self.id |
|
else: |
|
|
|
data = { |
|
'username': self.username, |
|
'password': self.password, |
|
'full_name': self.full_name, |
|
'email': self.email, |
|
'role': self.role, |
|
'status': self.status |
|
} |
|
|
|
self.id = db.insert('users', data) |
|
return self.id |
|
except Exception as e: |
|
logger.error(f"خطأ في حفظ المستخدم: {str(e)}") |
|
return None |
|
|
|
def delete(self, db): |
|
"""حذف المستخدم""" |
|
try: |
|
if self.id: |
|
db.delete('users', f"id = {self.id}") |
|
return True |
|
|
|
return False |
|
except Exception as e: |
|
logger.error(f"خطأ في حذف المستخدم: {str(e)}") |
|
return False |
|
|
|
|
|
class Project: |
|
"""نموذج المشروع""" |
|
|
|
def __init__(self, id=None, name=None, client=None, description=None, start_date=None, end_date=None, status=None, created_by=None): |
|
"""تهيئة نموذج المشروع""" |
|
self.id = id |
|
self.name = name |
|
self.client = client |
|
self.description = description |
|
self.start_date = start_date |
|
self.end_date = end_date |
|
self.status = status |
|
self.created_by = created_by |
|
self.created_at = None |
|
self.updated_at = None |
|
|
|
@staticmethod |
|
def get_by_id(project_id, db): |
|
"""الحصول على المشروع بواسطة المعرف""" |
|
try: |
|
query = "SELECT * FROM projects WHERE id = ?" |
|
result = db.fetch_one(query, (project_id,)) |
|
|
|
if result: |
|
project = Project() |
|
project.id = result[0] |
|
project.name = result[1] |
|
project.client = result[2] |
|
project.description = result[3] |
|
project.start_date = result[4] |
|
project.end_date = result[5] |
|
project.status = result[6] |
|
project.created_by = result[7] |
|
project.created_at = result[8] |
|
project.updated_at = result[9] |
|
|
|
return project |
|
|
|
return None |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المشروع: {str(e)}") |
|
return None |
|
|
|
@staticmethod |
|
def get_all(db): |
|
"""الحصول على جميع المشاريع""" |
|
try: |
|
query = "SELECT * FROM projects" |
|
results = db.fetch_all(query) |
|
|
|
projects = [] |
|
for result in results: |
|
project = Project() |
|
project.id = result[0] |
|
project.name = result[1] |
|
project.client = result[2] |
|
project.description = result[3] |
|
project.start_date = result[4] |
|
project.end_date = result[5] |
|
project.status = result[6] |
|
project.created_by = result[7] |
|
project.created_at = result[8] |
|
project.updated_at = result[9] |
|
|
|
projects.append(project) |
|
|
|
return projects |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المشاريع: {str(e)}") |
|
return [] |
|
|
|
def save(self, db): |
|
"""حفظ المشروع""" |
|
try: |
|
if self.id: |
|
|
|
data = { |
|
'name': self.name, |
|
'client': self.client, |
|
'description': self.description, |
|
'start_date': self.start_date, |
|
'end_date': self.end_date, |
|
'status': self.status, |
|
'updated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
} |
|
|
|
db.update('projects', data, f"id = {self.id}") |
|
return self.id |
|
else: |
|
|
|
data = { |
|
'name': self.name, |
|
'client': self.client, |
|
'description': self.description, |
|
'start_date': self.start_date, |
|
'end_date': self.end_date, |
|
'status': self.status, |
|
'created_by': self.created_by |
|
} |
|
|
|
self.id = db.insert('projects', data) |
|
return self.id |
|
except Exception as e: |
|
logger.error(f"خطأ في حفظ المشروع: {str(e)}") |
|
return None |
|
|
|
def delete(self, db): |
|
"""حذف المشروع""" |
|
try: |
|
if self.id: |
|
db.delete('projects', f"id = {self.id}") |
|
return True |
|
|
|
return False |
|
except Exception as e: |
|
logger.error(f"خطأ في حذف المشروع: {str(e)}") |
|
return False |
|
|
|
|
|
class Document: |
|
"""نموذج المستند""" |
|
|
|
def __init__(self, id=None, project_id=None, name=None, file_path=None, document_type=None, description=None, uploaded_by=None): |
|
"""تهيئة نموذج المستند""" |
|
self.id = id |
|
self.project_id = project_id |
|
self.name = name |
|
self.file_path = file_path |
|
self.document_type = document_type |
|
self.description = description |
|
self.uploaded_by = uploaded_by |
|
self.uploaded_at = None |
|
|
|
@staticmethod |
|
def get_by_id(document_id, db): |
|
"""الحصول على المستند بواسطة المعرف""" |
|
try: |
|
query = "SELECT * FROM documents WHERE id = ?" |
|
result = db.fetch_one(query, (document_id,)) |
|
|
|
if result: |
|
document = Document() |
|
document.id = result[0] |
|
document.project_id = result[1] |
|
document.name = result[2] |
|
document.file_path = result[3] |
|
document.document_type = result[4] |
|
document.description = result[5] |
|
document.uploaded_by = result[6] |
|
document.uploaded_at = result[7] |
|
|
|
return document |
|
|
|
return None |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المستند: {str(e)}") |
|
return None |
|
|
|
@staticmethod |
|
def get_by_project(project_id, db): |
|
"""الحصول على المستندات بواسطة معرف المشروع""" |
|
try: |
|
query = "SELECT * FROM documents WHERE project_id = ?" |
|
results = db.fetch_all(query, (project_id,)) |
|
|
|
documents = [] |
|
for result in results: |
|
document = Document() |
|
document.id = result[0] |
|
document.project_id = result[1] |
|
document.name = result[2] |
|
document.file_path = result[3] |
|
document.document_type = result[4] |
|
document.description = result[5] |
|
document.uploaded_by = result[6] |
|
document.uploaded_at = result[7] |
|
|
|
documents.append(document) |
|
|
|
return documents |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المستندات: {str(e)}") |
|
return [] |
|
|
|
def save(self, db): |
|
"""حفظ المستند""" |
|
try: |
|
if self.id: |
|
|
|
data = { |
|
'project_id': self.project_id, |
|
'name': self.name, |
|
'file_path': self.file_path, |
|
'document_type': self.document_type, |
|
'description': self.description |
|
} |
|
|
|
db.update('documents', data, f"id = {self.id}") |
|
return self.id |
|
else: |
|
|
|
data = { |
|
'project_id': self.project_id, |
|
'name': self.name, |
|
'file_path': self.file_path, |
|
'document_type': self.document_type, |
|
'description': self.description, |
|
'uploaded_by': self.uploaded_by |
|
} |
|
|
|
self.id = db.insert('documents', data) |
|
return self.id |
|
except Exception as e: |
|
logger.error(f"خطأ في حفظ المستند: {str(e)}") |
|
return None |
|
|
|
def delete(self, db): |
|
"""حذف المستند""" |
|
try: |
|
if self.id: |
|
db.delete('documents', f"id = {self.id}") |
|
return True |
|
|
|
return False |
|
except Exception as e: |
|
logger.error(f"خطأ في حذف المستند: {str(e)}") |
|
return False |
|
|
|
|
|
class PricingItem: |
|
"""نموذج بند التسعير""" |
|
|
|
def __init__(self, id=None, project_id=None, item_number=None, description=None, unit=None, quantity=None, unit_price=None, total_price=None, created_by=None): |
|
"""تهيئة نموذج بند التسعير""" |
|
self.id = id |
|
self.project_id = project_id |
|
self.item_number = item_number |
|
self.description = description |
|
self.unit = unit |
|
self.quantity = quantity |
|
self.unit_price = unit_price |
|
self.total_price = total_price |
|
self.created_by = created_by |
|
self.created_at = None |
|
self.updated_at = None |
|
|
|
@staticmethod |
|
def get_by_project(project_id, db): |
|
"""الحصول على بنود التسعير بواسطة معرف المشروع""" |
|
try: |
|
query = "SELECT * FROM pricing_items WHERE project_id = ?" |
|
results = db.fetch_all(query, (project_id,)) |
|
|
|
items = [] |
|
for result in results: |
|
item = PricingItem() |
|
item.id = result[0] |
|
item.project_id = result[1] |
|
item.item_number = result[2] |
|
item.description = result[3] |
|
item.unit = result[4] |
|
item.quantity = result[5] |
|
item.unit_price = result[6] |
|
item.total_price = result[7] |
|
item.created_by = result[8] |
|
item.created_at = result[9] |
|
item.updated_at = result[10] |
|
|
|
items.append(item) |
|
|
|
return items |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على بنود التسعير: {str(e)}") |
|
return [] |
|
|
|
def save(self, db): |
|
"""حفظ بند التسعير""" |
|
try: |
|
if self.id: |
|
|
|
data = { |
|
'project_id': self.project_id, |
|
'item_number': self.item_number, |
|
'description': self.description, |
|
'unit': self.unit, |
|
'quantity': self.quantity, |
|
'unit_price': self.unit_price, |
|
'total_price': self.total_price, |
|
'updated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
} |
|
|
|
db.update('pricing_items', data, f"id = {self.id}") |
|
return self.id |
|
else: |
|
|
|
data = { |
|
'project_id': self.project_id, |
|
'item_number': self.item_number, |
|
'description': self.description, |
|
'unit': self.unit, |
|
'quantity': self.quantity, |
|
'unit_price': self.unit_price, |
|
'total_price': self.total_price, |
|
'created_by': self.created_by |
|
} |
|
|
|
self.id = db.insert('pricing_items', data) |
|
return self.id |
|
except Exception as e: |
|
logger.error(f"خطأ في حفظ بند التسعير: {str(e)}") |
|
return None |
|
|
|
|
|
class Risk: |
|
"""نموذج المخاطرة""" |
|
|
|
def __init__(self, id=None, project_id=None, name=None, category=None, probability=None, impact=None, risk_level=None, mitigation_strategy=None, created_by=None): |
|
"""تهيئة نموذج المخاطرة""" |
|
self.id = id |
|
self.project_id = project_id |
|
self.name = name |
|
self.category = category |
|
self.probability = probability |
|
self.impact = impact |
|
self.risk_level = risk_level |
|
self.mitigation_strategy = mitigation_strategy |
|
self.created_by = created_by |
|
self.created_at = None |
|
self.updated_at = None |
|
|
|
@staticmethod |
|
def get_by_project(project_id, db): |
|
"""الحصول على المخاطر بواسطة معرف المشروع""" |
|
try: |
|
query = "SELECT * FROM risks WHERE project_id = ?" |
|
results = db.fetch_all(query, (project_id,)) |
|
|
|
risks = [] |
|
for result in results: |
|
risk = Risk() |
|
risk.id = result[0] |
|
risk.project_id = result[1] |
|
risk.name = result[2] |
|
risk.category = result[3] |
|
risk.probability = result[4] |
|
risk.impact = result[5] |
|
risk.risk_level = result[6] |
|
risk.mitigation_strategy = result[7] |
|
risk.created_by = result[8] |
|
risk.created_at = result[9] |
|
risk.updated_at = result[10] |
|
|
|
risks.append(risk) |
|
|
|
return risks |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على المخاطر: {str(e)}") |
|
return [] |
|
|
|
def save(self, db): |
|
"""حفظ المخاطرة""" |
|
try: |
|
if self.id: |
|
|
|
data = { |
|
'project_id': self.project_id, |
|
'name': self.name, |
|
'category': self.category, |
|
'probability': self.probability, |
|
'impact': self.impact, |
|
'risk_level': self.risk_level, |
|
'mitigation_strategy': self.mitigation_strategy, |
|
'updated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
} |
|
|
|
db.update('risks', data, f"id = {self.id}") |
|
return self.id |
|
else: |
|
|
|
data = { |
|
'project_id': self.project_id, |
|
'name': self.name, |
|
'category': self.category, |
|
'probability': self.probability, |
|
'impact': self.impact, |
|
'risk_level': self.risk_level, |
|
'mitigation_strategy': self.mitigation_strategy, |
|
'created_by': self.created_by |
|
} |
|
|
|
self.id = db.insert('risks', data) |
|
return self.id |
|
except Exception as e: |
|
logger.error(f"خطأ في حفظ المخاطرة: {str(e)}") |
|
return None |
|
|
|
|
|
class Report: |
|
"""نموذج التقرير""" |
|
|
|
def __init__(self, id=None, name=None, project_id=None, report_type=None, period=None, file_path=None, created_by=None, status=None): |
|
"""تهيئة نموذج التقرير""" |
|
self.id = id |
|
self.name = name |
|
self.project_id = project_id |
|
self.report_type = report_type |
|
self.period = period |
|
self.file_path = file_path |
|
self.created_by = created_by |
|
self.status = status |
|
self.created_at = None |
|
self.updated_at = None |
|
|
|
@staticmethod |
|
def get_by_project(project_id, db): |
|
"""الحصول على التقارير بواسطة معرف المشروع""" |
|
try: |
|
query = "SELECT * FROM reports WHERE project_id = ?" |
|
results = db.fetch_all(query, (project_id,)) |
|
|
|
reports = [] |
|
for result in results: |
|
report = Report() |
|
report.id = result[0] |
|
report.name = result[1] |
|
report.project_id = result[2] |
|
report.report_type = result[3] |
|
report.period = result[4] |
|
report.file_path = result[5] |
|
report.created_by = result[6] |
|
report.status = result[7] |
|
report.created_at = result[8] |
|
report.updated_at = result[9] |
|
|
|
reports.append(report) |
|
|
|
return reports |
|
except Exception as e: |
|
logger.error(f"خطأ في الحصول على التقارير: {str(e)}") |
|
return [] |
|
|
|
def save(self, db): |
|
"""حفظ التقرير""" |
|
try: |
|
if self.id: |
|
|
|
data = { |
|
'name': self.name, |
|
'project_id': self.project_id, |
|
'report_type': self.report_type, |
|
'period': self.period, |
|
'file_path': self.file_path, |
|
'status': self.status, |
|
'updated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
} |
|
|
|
db.update('reports', data, f"id = {self.id}") |
|
return self.id |
|
else: |
|
|
|
data = { |
|
'name': self.name, |
|
'project_id': self.project_id, |
|
'report_type': self.report_type, |
|
'period': self.period, |
|
'file_path': self.file_path, |
|
'created_by': self.created_by, |
|
'status': self.status |
|
} |
|
|
|
self.id = db.insert('reports', data) |
|
return self.id |
|
except Exception as e: |
|
logger.error(f"خطأ في حفظ التقرير: {str(e)}") |
|
return None |
|
|