Spaces:
Paused
Paused
| import streamlit as st | |
| import pandas as pd | |
| import plotly.express as px | |
| from datetime import datetime, timedelta | |
| import time | |
| class ReportsApp: | |
| """وحدة التقارير والتحليلات""" | |
| def __init__(self): | |
| pass | |
| def render(self): | |
| st.markdown("<h1 class='module-title'>وحدة التقارير والتحليلات</h1>", unsafe_allow_html=True) | |
| tabs = st.tabs(["لوحة المعلومات", "تقارير المشاريع", "تقارير التسعير", "تقارير المخاطر", "التقارير المخصصة"]) | |
| with tabs[0]: | |
| self._render_dashboard_tab() | |
| # باقي التبويبات موجودة ولكن لم يتم طلب تصحيحها في هذا السياق | |
| def _render_dashboard_tab(self): | |
| st.markdown("### لوحة معلومات النظام") | |
| col1, col2, col3, col4 = st.columns(4) | |
| with col1: | |
| total_projects = self._get_total_projects() | |
| st.metric("إجمالي المشاريع", total_projects) | |
| with col2: | |
| active_projects = self._get_active_projects() | |
| st.metric("المشاريع النشطة", active_projects, delta=f"{active_projects/total_projects*100:.1f}%" if total_projects > 0 else "0%") | |
| with col3: | |
| won_projects = self._get_won_projects() | |
| st.metric("المشاريع المرساة", won_projects, delta=f"{won_projects/total_projects*100:.1f}%" if total_projects > 0 else "0%") | |
| with col4: | |
| avg_local_content = self._get_avg_local_content() | |
| st.metric("متوسط المحتوى المحلي", f"{avg_local_content:.1f}%", delta=f"{avg_local_content-70:.1f}%" if avg_local_content > 0 else "0%") | |
| st.markdown("#### توزيع المشاريع حسب الحالة") | |
| project_status_data = self._get_project_status_data() | |
| fig = px.pie(project_status_data, values='count', names='status', title='توزيع المشاريع حسب الحالة', hole=0.4) | |
| st.plotly_chart(fig, use_container_width=True) | |
| st.markdown("#### اتجاه المشاريع الشهري") | |
| monthly_data = self._get_monthly_project_data() | |
| fig = px.line(monthly_data, x='month', y=['new', 'submitted', 'won'], title='اتجاه المشاريع الشهري') | |
| st.plotly_chart(fig, use_container_width=True) | |
| st.markdown("#### توزيع قيم المشاريع") | |
| project_value_data = self._get_project_value_data() | |
| fig = px.bar(project_value_data, x='range', y='count', title='توزيع قيم المشاريع') | |
| st.plotly_chart(fig, use_container_width=True) | |
| def _get_total_projects(self): | |
| return 10 | |
| def _get_active_projects(self): | |
| return 7 | |
| def _get_won_projects(self): | |
| return 4 | |
| def _get_avg_local_content(self): | |
| return 72.5 | |
| def _get_project_status_data(self): | |
| return pd.DataFrame({ | |
| 'status': ['جديد', 'قيد التنفيذ', 'تمت الترسية', 'ملغي'], | |
| 'count': [5, 3, 1, 1] | |
| }) | |
| def _get_monthly_project_data(self): | |
| return pd.DataFrame({ | |
| 'month': ['يناير', 'فبراير', 'مارس'], | |
| 'new': [2, 3, 4], | |
| 'submitted': [1, 2, 3], | |
| 'won': [0, 1, 2] | |
| }) | |
| def _get_project_value_data(self): | |
| return pd.DataFrame({ | |
| 'range': ['0-500K', '500K-1M', '1M-2M', '2M+'], | |
| 'count': [2, 3, 4, 1] | |
| }) | |