File size: 4,171 Bytes
d9e7bdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px

class RiskAnalyzer:
    def __init__(self):
        self.risk_categories = [
            "مخاطر السوق",
            "مخاطر التنفيذ",
            "مخاطر العقود",
            "مخاطر التمويل",
            "مخاطر الموارد"
        ]

        self.impact_levels = {
            "منخفض": 1,
            "متوسط": 2,
            "عالي": 3,
            "حرج": 4
        }

        self.probability_levels = {
            "نادر": 1,
            "محتمل": 2,
            "مرجح": 3,
            "شبه مؤكد": 4
        }

    def render(self):
        """عرض واجهة تحليل المخاطر"""
        st.markdown("### تحليل المخاطر")

        # إضافة مخاطر جديدة
        with st.form("add_risk_form"):
            col1, col2 = st.columns(2)

            with col1:
                category = st.selectbox("فئة المخاطر", self.risk_categories)
                description = st.text_area("وصف المخاطر")
                probability = st.selectbox("احتمالية الحدوث", list(self.probability_levels.keys()))

            with col2:
                impact = st.selectbox("مستوى التأثير", list(self.impact_levels.keys()))
                response = st.text_area("استراتيجية الاستجابة")
                responsible = st.text_input("المسؤول")

            if st.form_submit_button("إضافة المخاطر"):
                if not description or not response:
                    st.error("يرجى إدخال جميع البيانات المطلوبة")
                else:
                    if 'project_risks' not in st.session_state:
                        st.session_state.project_risks = []

                    risk = {
                        'category': category,
                        'description': description,
                        'probability': probability,
                        'impact': impact,
                        'response': response,
                        'responsible': responsible,
                        'risk_score': self.probability_levels[probability] * self.impact_levels[impact]
                    }

                    st.session_state.project_risks.append(risk)
                    st.success("تم إضافة المخاطر بنجاح")
                    st.rerun()

        # عرض المخاطر المضافة
        if 'project_risks' in st.session_state and st.session_state.project_risks:
            st.markdown("### المخاطر المحددة")
            risks_df = pd.DataFrame(st.session_state.project_risks)
            # تعيين أسماء الأعمدة بالعربية
            column_names = {
                'category': 'فئة المخاطر',
                'description': 'وصف المخاطر',
                'probability': 'احتمالية الحدوث',
                'impact': 'مستوى التأثير',
                'response': 'استراتيجية الاستجابة',
                'responsible': 'المسؤول',
                'risk_score': 'درجة الخطورة'
            }
            risks_df = risks_df.rename(columns=column_names)
            st.dataframe(risks_df)

            # عرض مصفوفة المخاطر
            self._render_risk_matrix(risks_df)

    def _render_risk_matrix(self, risks_df):
        """عرض مصفوفة المخاطر"""
        st.markdown("### مصفوفة المخاطر")

        matrix_data = np.zeros((4, 4))
        for _, risk in risks_df.iterrows():
            prob_idx = self.probability_levels[risk['احتمالية الحدوث']] - 1
            impact_idx = self.impact_levels[risk['مستوى التأثير']] - 1
            matrix_data[prob_idx, impact_idx] += 1

        fig = px.imshow(
            matrix_data,
            labels=dict(x="التأثير", y="الاحتمالية"),
            x=list(self.impact_levels.keys()),
            y=list(self.probability_levels.keys())
        )
        st.plotly_chart(fig)