|
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() |
|
|