File size: 17,151 Bytes
4500ed3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cb73ab3
4500ed3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e7d9317
4500ed3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
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()