SA-SAJCOAI / modules /reports /reports_app.py
EGYADMIN's picture
Upload 75 files
fb20480 verified
raw
history blame contribute delete
3.63 kB
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]
})