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"{project['status']}", 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="mohammed@example.com") 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()