File size: 3,538 Bytes
82676b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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]
        })