Wahbi-AI / pricing_system /integrated_app.py
EGYADMIN's picture
Update pricing_system/integrated_app.py
e7d9317 verified
raw
history blame
17.2 kB
import streamlit as st
import sys
import os
# إضافة مسار الوحدات الجديدة
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
# استيراد إطار التكامل
from pricing_system.integration_framework import IntegrationFramework
# استيراد الوحدات الأصلية
from modules.pricing.pricing_app import PricingApp
from modules.resources.resources_app import ResourcesApp
class IntegratedApp:
"""
التطبيق المتكامل الذي يجمع بين النظام القديم والنظام الجديد
"""
def __init__(self):
"""
تهيئة التطبيق المتكامل
"""
# تهيئة حالة الجلسة إذا لم تكن موجودة
if 'integrated_app_initialized' not in st.session_state:
st.session_state.integrated_app_initialized = True
st.session_state.current_module = "pricing" # القيمة الافتراضية
# إنشاء مثيلات من الوحدات الأصلية
self.pricing_app = PricingApp()
self.resources_app = ResourcesApp()
# إنشاء مثيل من إطار التكامل
self.integration_framework = IntegrationFramework()
# ربط الوحدات مع إطار التكامل
self.integration_framework.connect_pricing_app(self.pricing_app)
self.integration_framework.connect_resources_app(self.resources_app)
def run(self):
"""
تشغيل التطبيق المتكامل
"""
# عرض شعار التطبيق والعنوان
st.sidebar.image("logo.png", width=200)
st.sidebar.title("نظام تحليل المناقصات")
# عرض قائمة الوحدات الرئيسية
main_modules = ["التسعير", "الموارد", "المشاريع", "التقارير", "الإعدادات"]
selected_module = st.sidebar.radio("اختر الوحدة:", main_modules)
# تحديد الوحدة الحالية
if selected_module == "التسعير":
st.session_state.current_module = "pricing"
elif selected_module == "الموارد":
st.session_state.current_module = "resources"
elif selected_module == "المشاريع":
st.session_state.current_module = "projects"
elif selected_module == "التقارير":
st.session_state.current_module = "reports"
elif selected_module == "الإعدادات":
st.session_state.current_module = "settings"
# عرض الوحدة المختارة
if st.session_state.current_module == "pricing":
self.pricing_app.render()
elif st.session_state.current_module == "resources":
self.resources_app.render()
elif st.session_state.current_module == "projects":
self._render_projects_module()
elif st.session_state.current_module == "reports":
self._render_reports_module()
elif st.session_state.current_module == "settings":
self._render_settings_module()
def _render_projects_module(self):
"""
عرض وحدة المشاريع
"""
st.title("إدارة المشاريع")
# عرض قائمة المشاريع
st.subheader("قائمة المشاريع")
# بيانات المشاريع النموذجية
projects = [
{"name": "مشروع البنية التحتية للحي السكني", "client": "وزارة الإسكان", "status": "قيد التنفيذ"},
{"name": "مشروع تطوير شبكة الصرف الصحي", "client": "وزارة البيئة والمياه والزراعة", "status": "مكتمل"},
{"name": "مشروع إنشاء طريق سريع", "client": "وزارة النقل", "status": "قيد التخطيط"},
{"name": "مشروع بناء جسر", "client": "أمانة المنطقة الشرقية", "status": "قيد التنفيذ"},
{"name": "مشروع تصريف مياه السيول", "client": "وزارة البيئة والمياه والزراعة", "status": "قيد التخطيط"}
]
# عرض المشاريع في جدول
for i, project in enumerate(projects):
col1, col2, col3, col4 = st.columns([3, 2, 2, 1])
with col1:
st.write(project["name"])
with col2:
st.write(project["client"])
with col3:
status_color = "green" if project["status"] == "مكتمل" else "blue" if project["status"] == "قيد التنفيذ" else "orange"
st.markdown(f"<span style='color:{status_color}'>{project['status']}</span>", unsafe_allow_html=True)
with col4:
if st.button("عرض", key=f"view_project_{i}"):
st.session_state.selected_project = project
# إضافة مشروع جديد
st.subheader("إضافة مشروع جديد")
with st.form("add_project_form"):
project_name = st.text_input("اسم المشروع")
project_client = st.text_input("الجهة المالكة")
project_location = st.text_input("الموقع")
project_type = st.selectbox(
"نوع المشروع",
["بنية تحتية", "صرف صحي", "طرق", "سيول", "كباري", "مباني", "أخرى"]
)
project_budget = st.number_input("الميزانية التقديرية (ريال)", min_value=0.0, step=100000.0)
col1, col2 = st.columns(2)
with col1:
project_start_date = st.date_input("تاريخ البدء")
with col2:
project_end_date = st.date_input("تاريخ الانتهاء المتوقع")
project_description = st.text_area("وصف المشروع")
submit_button = st.form_submit_button("إضافة المشروع")
if submit_button:
if project_name and project_client:
st.success(f"تمت إضافة مشروع {project_name} بنجاح")
else:
st.error("يرجى إدخال اسم المشروع والجهة المالكة")
def _render_reports_module(self):
"""
عرض وحدة التقارير
"""
st.title("التقارير")
# أنواع التقارير
report_types = [
"تقرير ملخص المشروع",
"تقرير تحليل التكاليف",
"تقرير سيناريوهات التسعير",
"تقرير المحتوى المحلي",
"تقرير الإدارات المساندة",
"تقرير المقارنة التنافسية",
"تقرير الموارد المستخدمة"
]
# اختيار نوع التقرير
selected_report = st.selectbox("اختر نوع التقرير", report_types)
# اختيار المشروع
projects = [
"مشروع البنية التحتية للحي السكني",
"مشروع تطوير شبكة الصرف الصحي",
"مشروع إنشاء طريق سريع",
"مشروع بناء جسر",
"مشروع تصريف مياه السيول"
]
selected_project = st.selectbox("اختر المشروع", projects)
# خيارات التقرير
st.subheader("خيارات التقرير")
col1, col2 = st.columns(2)
with col1:
include_charts = st.checkbox("تضمين الرسوم البيانية", value=True)
include_details = st.checkbox("تضمين التفاصيل", value=True)
with col2:
report_format = st.radio("تنسيق التقرير", ["PDF", "Excel", "Word"])
include_logo = st.checkbox("تضمين الشعار", value=True)
# إنشاء التقرير
if st.button("إنشاء التقرير"):
st.success(f"تم إنشاء {selected_report} لـ {selected_project} بنجاح")
# عرض نموذج للتقرير
st.subheader("معاينة التقرير")
if selected_report == "تقرير ملخص المشروع":
st.write("**معلومات المشروع:**")
st.write(f"- اسم المشروع: {selected_project}")
st.write("- الجهة المالكة: وزارة الإسكان")
st.write("- الموقع: الرياض")
st.write("- تاريخ البدء: 2023-01-15")
st.write("- تاريخ الانتهاء المتوقع: 2024-06-30")
st.write("- الميزانية التقديرية: 25,000,000 ريال")
st.write("**ملخص التكاليف:**")
st.write("- إجمالي التكاليف المباشرة: 18,500,000 ريال")
st.write("- إجمالي التكاليف غير المباشرة: 3,700,000 ريال")
st.write("- هامش الربح: 2,800,000 ريال")
st.write("- إجمالي سعر المشروع: 25,000,000 ريال")
if include_charts:
st.subheader("الرسوم البيانية")
st.bar_chart({"التكاليف المباشرة": 18.5, "التكاليف غير المباشرة": 3.7, "هامش الربح": 2.8})
elif selected_report == "تقرير المحتوى المحلي":
st.write("**تحليل المحتوى المحلي:**")
st.write("- نسبة المحتوى المحلي: 42.5%")
st.write("- النسبة المستهدفة: 40.0%")
st.write("- الفائض: 2.5%")
st.write("**تفاصيل المحتوى المحلي حسب نوع الموارد:**")
st.write("- المواد: 35.2%")
st.write("- المعدات: 48.7%")
st.write("- العمالة: 52.3%")
st.write("- مقاولي الباطن: 38.1%")
if include_charts:
st.subheader("الرسوم البيانية")
st.bar_chart({"المواد": 35.2, "المعدات": 48.7, "العمالة": 52.3, "مقاولي الباطن": 38.1})
# خيارات تصدير التقرير
st.download_button(
label=f"تحميل التقرير بتنسيق {report_format}",
data="تقرير نموذجي".encode("utf-8"), # ✅ الحل الصحيح
file_name=f"{selected_report}_{selected_project}.{report_format.lower()}",
mime="application/octet-stream"
)
def _render_settings_module(self):
"""
عرض وحدة الإعدادات
"""
st.title("الإعدادات")
tab1, tab2, tab3, tab4 = st.tabs(["إعدادات عامة", "إعدادات المستخدم", "إعدادات النظام", "النسخ الاحتياطي"])
with tab1:
st.subheader("الإعدادات العامة")
# إعدادات اللغة
st.write("**إعدادات اللغة:**")
language = st.selectbox("اللغة", ["العربية", "English"])
# إعدادات العرض
st.write("**إعدادات العرض:**")
theme = st.selectbox("السمة", ["الافتراضية", "داكنة", "فاتحة"])
sidebar_position = st.radio("موضع الشريط الجانبي", ["يمين", "يسار"])
# إعدادات التنبيهات
st.write("**إعدادات التنبيهات:**")
enable_notifications = st.checkbox("تفعيل التنبيهات", value=True)
notification_sound = st.checkbox("تفعيل صوت التنبيهات", value=True)
if st.button("حفظ الإعدادات العامة"):
st.success("تم حفظ الإعدادات العامة بنجاح")
with tab2:
st.subheader("إعدادات المستخدم")
# معلومات المستخدم
st.write("**معلومات المستخدم:**")
user_name = st.text_input("اسم المستخدم", value="محمد أحمد")
user_email = st.text_input("البريد الإلكتروني", value="[email protected]")
user_phone = st.text_input("رقم الهاتف", value="0555555555")
# تغيير كلمة المرور
st.write("**تغيير كلمة المرور:**")
current_password = st.text_input("كلمة المرور الحالية", type="password")
new_password = st.text_input("كلمة المرور الجديدة", type="password")
confirm_password = st.text_input("تأكيد كلمة المرور الجديدة", type="password")
if st.button("حفظ إعدادات المستخدم"):
if new_password and new_password == confirm_password:
st.success("تم حفظ إعدادات المستخدم بنجاح")
elif new_password and new_password != confirm_password:
st.error("كلمة المرور الجديدة وتأكيدها غير متطابقين")
else:
st.success("تم حفظ إعدادات المستخدم بنجاح")
with tab3:
st.subheader("إعدادات النظام")
# إعدادات قاعدة البيانات
st.write("**إعدادات قاعدة البيانات:**")
db_type = st.selectbox("نوع قاعدة البيانات", ["SQLite", "MySQL", "PostgreSQL"])
db_host = st.text_input("عنوان الخادم", value="localhost")
db_port = st.text_input("المنفذ", value="3306")
db_name = st.text_input("اسم قاعدة البيانات", value="tender_analysis_db")
# إعدادات النسخ الاحتياطي التلقائي
st.write("**إعدادات النسخ الاحتياطي التلقائي:**")
auto_backup = st.checkbox("تفعيل النسخ الاحتياطي التلقائي", value=True)
backup_frequency = st.selectbox("تكرار النسخ الاحتياطي", ["يومي", "أسبوعي", "شهري"])
backup_time = st.time_input("وقت النسخ الاحتياطي")
if st.button("حفظ إعدادات النظام"):
st.success("تم حفظ إعدادات النظام بنجاح")
with tab4:
st.subheader("النسخ الاحتياطي")
# إنشاء نسخة احتياطية
st.write("**إنشاء نسخة احتياطية:**")
backup_type = st.radio("نوع النسخ الاحتياطي", ["كامل", "جزئي"])
if backup_type == "جزئي":
st.multiselect(
"اختر البيانات المراد نسخها",
["المشاريع", "المناقصات", "الموارد", "التسعير", "المستخدمين", "الإعدادات"]
)
if st.button("إنشاء نسخة احتياطية"):
st.success("تم إنشاء النسخة الاحتياطية بنجاح")
st.download_button(
label="تحميل النسخة الاحتياطية",
data="تحميل النسخة الاحتياطية".encode("utf-8"), # ✅ الحل الصحيح
file_name="backup_2025-04-01.zip",
mime="application/zip"
)
# استعادة نسخة احتياطية
st.write("**استعادة نسخة احتياطية:**")
uploaded_file = st.file_uploader("اختر ملف النسخة الاحتياطية", type=["zip"])
if uploaded_file is not None:
if st.button("استعادة النسخة الاحتياطية"):
st.success("تم استعادة النسخة الاحتياطية بنجاح")
# تشغيل التطبيق المتكامل
if __name__ == "__main__":
app = IntegratedApp()
app.run()