EGYADMIN commited on
Commit
2b98269
·
verified ·
1 Parent(s): 864160b

Create analysis/risk_analyzer.py

Browse files
Files changed (1) hide show
  1. analysis/risk_analyzer.py +668 -0
analysis/risk_analyzer.py ADDED
@@ -0,0 +1,668 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ محلل المخاطر في المناقصات
3
+ يقوم بتحليل وتحديد المخاطر المحتملة في المناقصات وتقديم خطط للتخفيف منها
4
+ """
5
+
6
+ import re
7
+ import json
8
+ import logging
9
+ import os
10
+ from typing import Dict, List, Any, Tuple, Optional, Union
11
+ import numpy as np
12
+ from collections import defaultdict
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ class RiskAnalyzer:
17
+ """
18
+ محلل المخاطر في المناقصات
19
+ """
20
+
21
+ def __init__(self, llm_processor, config=None):
22
+ """
23
+ تهيئة محلل المخاطر
24
+
25
+ المعاملات:
26
+ ----------
27
+ llm_processor : LLMProcessor
28
+ معالج نماذج اللغة الكبيرة
29
+ config : Dict, optional
30
+ إعدادات المحلل
31
+ """
32
+ self.config = config or {}
33
+ self.llm_processor = llm_processor
34
+
35
+ # تحميل قوالب المخاطر
36
+ self.risk_templates = self._load_risk_templates()
37
+
38
+ logger.info("تم تهيئة محلل المخاطر")
39
+
40
+ def analyze(self, extracted_text: str) -> Dict[str, Any]:
41
+ """
42
+ تحليل المخاطر من نص المناقصة
43
+
44
+ المعاملات:
45
+ ----------
46
+ extracted_text : str
47
+ النص المستخرج من المناقصة
48
+
49
+ المخرجات:
50
+ --------
51
+ Dict[str, Any]
52
+ نتائج تحليل المخاطر
53
+ """
54
+ try:
55
+ logger.info("بدء تحليل المخاطر")
56
+
57
+ # إذا كان معالج LLM متوفرًا، استخدمه لتحليل المخاطر
58
+ if self.llm_processor:
59
+ # تحليل المخاطر باستخدام نموذج اللغة الكبيرة
60
+ llm_risks = self.llm_processor.analyze_risks(extracted_text)
61
+
62
+ # استخدام المعلومات من تحليل LLM والمراجعة
63
+ risk_analysis = self._review_and_enhance_risks(llm_risks, extracted_text)
64
+
65
+ logger.info(f"اكتمل تحليل المخاطر باستخدام LLM: {len(risk_analysis['all_risks'])} مخاطر محددة")
66
+ return risk_analysis
67
+ else:
68
+ # تحليل المخاطر باستخدام النهج التقليدي
69
+ return self._traditional_risk_analysis(extracted_text)
70
+
71
+ except Exception as e:
72
+ logger.error(f"فشل في تحليل المخاطر: {str(e)}")
73
+ return {
74
+ "all_risks": [],
75
+ "technical_risks": [],
76
+ "financial_risks": [],
77
+ "supply_chain_risks": [],
78
+ "legal_risks": [],
79
+ "mitigation_plan": [],
80
+ "avg_severity": 0
81
+ }
82
+
83
+ def _traditional_risk_analysis(self, text: str) -> Dict[str, Any]:
84
+ """
85
+ تحليل المخاطر باستخدام النهج التقليدي
86
+
87
+ المعاملات:
88
+ ----------
89
+ text : str
90
+ النص المستخرج من المناقصة
91
+
92
+ المخرجات:
93
+ --------
94
+ Dict[str, Any]
95
+ نتائج تحليل المخاطر
96
+ """
97
+ # استخراج المخاطر من قوالب المخاطر
98
+ all_risks = []
99
+
100
+ # تحديد نوع المشروع
101
+ project_type = self._determine_project_type(text)
102
+
103
+ # استخراج المخاطر المشتركة
104
+ common_risks = self.risk_templates.get("common_risks", [])
105
+ all_risks.extend(common_risks)
106
+
107
+ # استخراج المخاطر الخاصة بنوع المشروع
108
+ project_specific_risks = self.risk_templates.get("project_types", {}).get(project_type, [])
109
+ all_risks.extend(project_specific_risks)
110
+
111
+ # البحث عن المخاطر المذكورة صراحة في النص
112
+ explicit_risks = self._extract_explicit_risks(text)
113
+ all_risks.extend(explicit_risks)
114
+
115
+ # تصنيف المخاطر
116
+ technical_risks = [risk for risk in all_risks if risk.get("type") == "technical"]
117
+ financial_risks = [risk for risk in all_risks if risk.get("type") == "financial"]
118
+ supply_chain_risks = [risk for risk in all_risks if risk.get("type") == "supply_chain"]
119
+ legal_risks = [risk for risk in all_risks if risk.get("type") == "legal"]
120
+
121
+ # حساب متوسط الخطورة
122
+ if all_risks:
123
+ avg_severity = sum(risk.get("severity", 0) for risk in all_risks) / len(all_risks)
124
+ else:
125
+ avg_severity = 0
126
+
127
+ # إعداد خطة تخفيف المخاطر
128
+ mitigation_plan = self._generate_mitigation_plan(all_risks)
129
+
130
+ return {
131
+ "all_risks": all_risks,
132
+ "technical_risks": technical_risks,
133
+ "financial_risks": financial_risks,
134
+ "supply_chain_risks": supply_chain_risks,
135
+ "legal_risks": legal_risks,
136
+ "mitigation_plan": mitigation_plan,
137
+ "avg_severity": avg_severity
138
+ }
139
+
140
+ def _determine_project_type(self, text: str) -> str:
141
+ """
142
+ تحديد نوع المشروع من النص
143
+
144
+ المعاملات:
145
+ ----------
146
+ text : str
147
+ النص المستخرج من المناقصة
148
+
149
+ المخرجات:
150
+ --------
151
+ str
152
+ نوع المشروع
153
+ """
154
+ # البحث عن الكلمات المفتاحية
155
+ keywords = {
156
+ "construction": ["إنشاء", "بناء", "تشييد", "مبنى", "عمارة", "هيكل", "مركز"],
157
+ "infrastructure": ["طريق", "جسر", "نفق", "سد", "شبكة", "بنية تحتية"],
158
+ "technology": ["تقنية", "برمجة", "نظام", "برنامج", "تطبيق", "حاسب", "رقمية"],
159
+ "maintenance": ["صيانة", "تأهيل", "إصلاح", "ترميم", "تحديث", "تجديد"],
160
+ "consulting": ["استشارة", "دراسة", "تصميم", "تخطيط", "استراتيجية"],
161
+ "services": ["خدمة", "تشغيل", "إدارة", "تقديم"]
162
+ }
163
+
164
+ # حساب عدد مرات ظهور كل كلمة مفتاحية
165
+ scores = defaultdict(int)
166
+
167
+ for project_type, words in keywords.items():
168
+ for word in words:
169
+ count = len(re.findall(r'\b' + re.escape(word) + r'\w*', text, re.IGNORECASE))
170
+ scores[project_type] += count
171
+
172
+ # تحديد نوع المشروع بناءً على أعلى نتيجة
173
+ if not scores:
174
+ return "general"
175
+
176
+ return max(scores, key=scores.get)
177
+
178
+ def _extract_explicit_risks(self, text: str) -> List[Dict[str, Any]]:
179
+ """
180
+ استخراج المخاطر المذكورة صراحة في النص
181
+
182
+ المعاملات:
183
+ ----------
184
+ text : str
185
+ النص المستخرج من المناقصة
186
+
187
+ المخرجات:
188
+ --------
189
+ List[Dict[str, Any]]
190
+ قائمة بالمخاطر المستخرجة
191
+ """
192
+ explicit_risks = []
193
+
194
+ # البحث عن كلمات المخاطر
195
+ risk_keywords = [
196
+ "مخاطر", "مخاطرة", "خطر", "تحدي", "صعوبة", "مشكلة", "عائق",
197
+ "تأخير", "تأخر", "عدم الالتزام", "خرق", "غرامة", "عقوبة"
198
+ ]
199
+
200
+ # البحث عن الفقرات التي تحتوي على كلمات المخاطر
201
+ for keyword in risk_keywords:
202
+ # البحث عن الفقرات التي تحتوي على الكلمة المفتاحية
203
+ matches = re.finditer(r'(?:[^\n.]*' + re.escape(keyword) + r'[^\n.]*[.\n])', text)
204
+
205
+ for match in matches:
206
+ risk_text = match.group(0).strip()
207
+
208
+ # تحديد نوع المخاطرة
209
+ risk_type = "general"
210
+
211
+ if any(word in risk_text.lower() for word in ["فني", "تقني", "هندسي", "جودة"]):
212
+ risk_type = "technical"
213
+ elif any(word in risk_text.lower() for word in ["مالي", "تكلفة", "سعر", "تمويل", "ميزانية"]):
214
+ risk_type = "financial"
215
+ elif any(word in risk_text.lower() for word in ["توريد", "إمداد", "مورد", "تأخير", "تسليم"]):
216
+ risk_type = "supply_chain"
217
+ elif any(word in risk_text.lower() for word in ["قانوني", "نظامي", "عقد", "التزام", "شرط", "غرامة"]):
218
+ risk_type = "legal"
219
+
220
+ # تقدير مستوى الخطورة
221
+ severity = 3 # متوسط افتراضيًا
222
+
223
+ if any(word in risk_text.lower() for word in ["كبير", "خطير", "جسيم", "عالي"]):
224
+ severity = 4
225
+ elif any(word in risk_text.lower() for word in ["متوسط"]):
226
+ severity = 3
227
+ elif any(word in risk_text.lower() for word in ["بسيط", "صغير", "منخفض"]):
228
+ severity = 2
229
+
230
+ # تقدير احتمالية الحدوث
231
+ probability = 3 # متوسط افتراضيًا
232
+
233
+ if any(word in risk_text.lower() for word in ["مؤكد", "حتمي", "دائمًا"]):
234
+ probability = 5
235
+ elif any(word in risk_text.lower() for word in ["محتمل", "غالبًا"]):
236
+ probability = 4
237
+ elif any(word in risk_text.lower() for word in ["ممكن", "أحيانًا"]):
238
+ probability = 3
239
+ elif any(word in risk_text.lower() for word in ["نادر", "غير محتمل"]):
240
+ probability = 2
241
+ elif any(word in risk_text.lower() for word in ["مستبعد", "غير ممكن"]):
242
+ probability = 1
243
+
244
+ # إضافة المخاطرة إذا لم تكن موجودة بالفعل
245
+ if not any(risk["risk"] == risk_text for risk in explicit_risks):
246
+ explicit_risks.append({
247
+ "risk": risk_text,
248
+ "type": risk_type,
249
+ "severity": severity,
250
+ "probability": probability,
251
+ "impact": "غير محدد",
252
+ "mitigation": "غير محدد"
253
+ })
254
+
255
+ return explicit_risks
256
+
257
+ def _review_and_enhance_risks(self, llm_risks: Dict[str, Any], text: str) -> Dict[str, Any]:
258
+ """
259
+ مراجعة وتعزيز المخاطر المحددة من LLM
260
+
261
+ المعاملات:
262
+ ----------
263
+ llm_risks : Dict[str, Any]
264
+ نتائج تحليل المخاطر من LLM
265
+ text : str
266
+ النص المستخرج من المناقصة
267
+
268
+ المخرجات:
269
+ --------
270
+ Dict[str, Any]
271
+ نتائج تحليل المخاطر المحسنة
272
+ """
273
+ # استخراج المخاطر من قوالب المخاطر
274
+ template_risks = []
275
+
276
+ # تحديد نوع المشروع
277
+ project_type = self._determine_project_type(text)
278
+
279
+ # استخراج المخاطر المشتركة
280
+ common_risks = self.risk_templates.get("common_risks", [])
281
+ template_risks.extend(common_risks)
282
+
283
+ # استخراج المخاطر الخاصة بنوع المشروع
284
+ project_specific_risks = self.risk_templates.get("project_types", {}).get(project_type, [])
285
+ template_risks.extend(project_specific_risks)
286
+
287
+ # دمج المخاطر من LLM والقوالب
288
+ all_risks = llm_risks.get("all_risks", []).copy()
289
+
290
+ # إضافة المخاطر من القوالب التي لم تكن موجودة بالفعل
291
+ for template_risk in template_risks:
292
+ if not any(self._is_similar_risk(template_risk, existing_risk) for existing_risk in all_risks):
293
+ all_risks.append(template_risk)
294
+
295
+ # تحديث تصنيف المخاطر
296
+ technical_risks = [risk for risk in all_risks if risk.get("type") == "technical"]
297
+ financial_risks = [risk for risk in all_risks if risk.get("type") == "financial"]
298
+ supply_chain_risks = [risk for risk in all_risks if risk.get("type") == "supply_chain"]
299
+ legal_risks = [risk for risk in all_risks if risk.get("type") == "legal"]
300
+
301
+ # حساب متوسط الخطورة
302
+ if all_risks:
303
+ avg_severity = sum(risk.get("severity", 0) for risk in all_risks) / len(all_risks)
304
+ else:
305
+ avg_severity = 0
306
+
307
+ # إعداد خطة تخفيف المخاطر
308
+ mitigation_plan = llm_risks.get("mitigation_plan", [])
309
+ if not mitigation_plan:
310
+ mitigation_plan = self._generate_mitigation_plan(all_risks)
311
+
312
+ return {
313
+ "all_risks": all_risks,
314
+ "technical_risks": technical_risks,
315
+ "financial_risks": financial_risks,
316
+ "supply_chain_risks": supply_chain_risks,
317
+ "legal_risks": legal_risks,
318
+ "mitigation_plan": mitigation_plan,
319
+ "avg_severity": avg_severity
320
+ }
321
+
322
+ def _is_similar_risk(self, risk1: Dict[str, Any], risk2: Dict[str, Any]) -> bool:
323
+ """
324
+ التحقق مما إذا كانت المخاطرتان متشابهتين
325
+
326
+ المعاملات:
327
+ ----------
328
+ risk1 : Dict[str, Any]
329
+ المخاطرة الأولى
330
+ risk2 : Dict[str, Any]
331
+ المخاطرة الثانية
332
+
333
+ المخرجات:
334
+ --------
335
+ bool
336
+ True إذا كانت المخاطرتان متشابهتين، False خلاف ذلك
337
+ """
338
+ # التحقق من التشابه في النص
339
+ risk1_text = risk1.get("risk", "").lower()
340
+ risk2_text = risk2.get("risk", "").lower()
341
+
342
+ # تحويل النصوص إلى مجموعات من الكلمات
343
+ words1 = set(risk1_text.split())
344
+ words2 = set(risk2_text.split())
345
+
346
+ # حساب معامل جاكارد للتشابه
347
+ intersection = len(words1.intersection(words2))
348
+ union = len(words1.union(words2))
349
+
350
+ if union == 0:
351
+ return False
352
+
353
+ jaccard = intersection / union
354
+
355
+ # إذا ك��ن معامل التشابه أكبر من العتبة، نعتبر المخاطرتين متشابهتين
356
+ return jaccard > 0.3
357
+
358
+ def _generate_mitigation_plan(self, risks: List[Dict[str, Any]]) -> List[str]:
359
+ """
360
+ إعداد خطة تخفيف المخاطر
361
+
362
+ المعاملات:
363
+ ----------
364
+ risks : List[Dict[str, Any]]
365
+ قائمة المخاطر
366
+
367
+ المخرجات:
368
+ --------
369
+ List[str]
370
+ خطة تخفيف المخاطر
371
+ """
372
+ mitigation_plan = []
373
+
374
+ # ترتيب المخاطر حسب الخطورة
375
+ sorted_risks = sorted(risks, key=lambda x: x.get("severity", 0) * x.get("probability", 0), reverse=True)
376
+
377
+ # إعداد خطة للمخاطر العالية
378
+ high_risks = [risk for risk in sorted_risks if risk.get("severity", 0) >= 4 or (risk.get("severity", 0) >= 3 and risk.get("probability", 0) >= 4)]
379
+
380
+ if high_risks:
381
+ mitigation_plan.append("إدارة المخاطر العالية:")
382
+
383
+ for i, risk in enumerate(high_risks):
384
+ mitigation = risk.get("mitigation", "")
385
+ if mitigation and mitigation != "غير محدد":
386
+ mitigation_plan.append(f"{i+1}. {risk.get('risk', '')}: {mitigation}")
387
+ else:
388
+ # إنشاء استراتيجية تخفيف افتراضية
389
+ default_mitigation = self._generate_default_mitigation(risk)
390
+ mitigation_plan.append(f"{i+1}. {risk.get('risk', '')}: {default_mitigation}")
391
+
392
+ # إعداد خطة للمخاطر المتوسطة
393
+ medium_risks = [risk for risk in sorted_risks if risk.get("severity", 0) == 3 and risk.get("probability", 0) <= 3]
394
+
395
+ if medium_risks:
396
+ mitigation_plan.append("\nإدارة المخاطر المتوسطة:")
397
+
398
+ for i, risk in enumerate(medium_risks[:3]): # اختيار أهم 3 مخاطر متوسطة
399
+ mitigation = risk.get("mitigation", "")
400
+ if mitigation and mitigation != "غير محدد":
401
+ mitigation_plan.append(f"{i+1}. {risk.get('risk', '')}: {mitigation}")
402
+ else:
403
+ # إنشاء استراتيجية تخفيف افتراضية
404
+ default_mitigation = self._generate_default_mitigation(risk)
405
+ mitigation_plan.append(f"{i+1}. {risk.get('risk', '')}: {default_mitigation}")
406
+
407
+ # إضافة استراتيجيات عامة
408
+ mitigation_plan.extend([
409
+ "\nاستراتيجيات عامة لإدارة المخاطر:",
410
+ "- إعداد سجل المخاطر ومراجعته بشكل دوري",
411
+ "- تعيين مسؤول لإدارة المخاطر ومتابعة خطط التخفيف",
412
+ "- إعداد خطط طوارئ للمخاطر العالية",
413
+ "- التواصل المستمر مع العميل والموردين لتحديد المخاطر المحتملة مبكرًا",
414
+ "- توثيق الدروس المستفادة من المشاريع السابقة"
415
+ ])
416
+
417
+ return mitigation_plan
418
+
419
+ def _generate_default_mitigation(self, risk: Dict[str, Any]) -> str:
420
+ """
421
+ إنشاء استراتيجية تخفيف افتراضية للمخاطرة
422
+
423
+ المعاملات:
424
+ ----------
425
+ risk : Dict[str, Any]
426
+ المخاطرة
427
+
428
+ المخرجات:
429
+ --------
430
+ str
431
+ استراتيجية التخفيف
432
+ """
433
+ risk_type = risk.get("type", "general")
434
+
435
+ if risk_type == "technical":
436
+ return "إجراء مراجعة فنية مفصلة، والاستعانة بخبراء متخصصين، وإعداد خطة اختبار شاملة."
437
+ elif risk_type == "financial":
438
+ return "إعداد ميزانية احتياطية، ومراجعة التكاليف بشكل دوري، وتأمين مصادر تمويل بديلة."
439
+ elif risk_type == "supply_chain":
440
+ return "تحديد موردين بدلاء، وإعداد مخزون احتياطي من المواد الحرجة، والتعاقد المبكر مع الموردين الرئيسيين."
441
+ elif risk_type == "legal":
442
+ return "مراجعة العقد من قبل مستشار قانوني، وتوثيق جميع التغييرات والموافقات، والالتزام الدقيق بالمتطلبات القانونية."
443
+ else:
444
+ return "إعداد خطة إدارة مخاطر مفصلة، وتعيين فريق لمتابعة المخاطر، وإجراء مراجعات دورية."
445
+
446
+ def _load_risk_templates(self) -> Dict[str, Any]:
447
+ """
448
+ تحميل قوالب المخاطر
449
+
450
+ المخرجات:
451
+ --------
452
+ Dict[str, Any]
453
+ قوالب المخاطر
454
+ """
455
+ try:
456
+ file_path = 'data/templates/risk_template.json'
457
+ if os.path.exists(file_path):
458
+ with open(file_path, 'r', encoding='utf-8') as f:
459
+ return json.load(f)
460
+ else:
461
+ logger.warning(f"ملف قوالب المخاطر غير موجود: {file_path}")
462
+ # إنشاء قوالب افتراضية
463
+ return self._create_default_risk_templates()
464
+ except Exception as e:
465
+ logger.error(f"فشل في تحميل قوالب المخاطر: {str(e)}")
466
+ return self._create_default_risk_templates()
467
+
468
+ def _create_default_risk_templates(self) -> Dict[str, Any]:
469
+ """
470
+ إنشاء قوالب افتراضية للمخاطر
471
+
472
+ المخرجات:
473
+ --------
474
+ Dict[str, Any]
475
+ قوالب افتراضية للمخاطر
476
+ """
477
+ return {
478
+ "common_risks": [
479
+ {
480
+ "risk": "تأخر في تسليم المواد من الموردين",
481
+ "type": "supply_chain",
482
+ "severity": 4,
483
+ "probability": 3,
484
+ "impact": "تأخير في جدول المشروع وزيادة التكاليف",
485
+ "mitigation": "تحديد موردين بدلاء وإعداد مخزون احتياطي من المواد الحرجة"
486
+ },
487
+ {
488
+ "risk": "تغييرات في نطاق العمل من قبل العميل",
489
+ "type": "technical",
490
+ "severity": 3,
491
+ "probability": 4,
492
+ "impact": "زيادة في التكاليف وتأخير في الجدول الزمني",
493
+ "mitigation": "توثيق نطاق العمل بدقة وإعداد إجراءات واضحة لإدارة التغييرات"
494
+ },
495
+ {
496
+ "risk": "نقص في العمالة الماهرة",
497
+ "type": "technical",
498
+ "severity": 3,
499
+ "probability": 3,
500
+ "impact": "انخفاض جودة العمل وتأخير في الجدول الزمني",
501
+ "mitigation": "التخطيط المبكر للموارد البشرية والتعاقد مع مقاولي الباطن المؤهلين"
502
+ },
503
+ {
504
+ "risk": "مشاكل في التدفق النقدي",
505
+ "type": "financial",
506
+ "severity": 4,
507
+ "probability": 3,
508
+ "impact": "عدم القدرة على تمويل المشروع وتأخير في التنفيذ",
509
+ "mitigation": "إعداد خطة تدفق نقدي دقيقة وتأمين تسهيلات ائتمانية"
510
+ },
511
+ {
512
+ "risk": "زيادة في أسعار المواد والخدمات",
513
+ "type": "financial",
514
+ "severity": 3,
515
+ "probability": 4,
516
+ "impact": "زيادة التكاليف وانخفاض هامش الربح",
517
+ "mitigation": "تضمين بند تعديل الأسعار في العقود وإعداد ميزانية احتياطية"
518
+ },
519
+ {
520
+ "risk": "تأخر في الحصول على التصاريح والموافقات",
521
+ "type": "legal",
522
+ "severity": 4,
523
+ "probability": 3,
524
+ "impact": "تأخير في بدء المشروع وزيادة التكاليف",
525
+ "mitigation": "بدء عملية الحصول على التصاريح مبكرًا والتواصل المستمر مع الجهات المعنية"
526
+ },
527
+ {
528
+ "risk": "نزاعات تعاقدية مع العميل أو المقاولين",
529
+ "type": "legal",
530
+ "severity": 4,
531
+ "probability": 2,
532
+ "impact": "تأخير في المشروع وتكاليف قانونية",
533
+ "mitigation": "صياغة العقود بدقة وتوثيق جميع التغييرات والموافقات"
534
+ }
535
+ ],
536
+ "project_types": {
537
+ "construction": [
538
+ {
539
+ "risk": "ظروف موقع غير متوقعة",
540
+ "type": "technical",
541
+ "severity": 4,
542
+ "probability": 3,
543
+ "impact": "زيادة في التكاليف وتأخير في الجدول الزمني",
544
+ "mitigation": "إجراء دراسات جيوتقنية شاملة وزيارات ميدانية للموق��"
545
+ },
546
+ {
547
+ "risk": "مشاكل في جودة المواد وعدم مطابقتها للمواصفات",
548
+ "type": "technical",
549
+ "severity": 4,
550
+ "probability": 3,
551
+ "impact": "إعادة العمل وتأخير في الجدول الزمني",
552
+ "mitigation": "تطبيق إجراءات فحص الجودة واختيار موردين موثوقين"
553
+ },
554
+ {
555
+ "risk": "حوادث السلامة في موقع العمل",
556
+ "type": "technical",
557
+ "severity": 5,
558
+ "probability": 2,
559
+ "impact": "إصابات للعاملين وتوقف العمل والمسؤولية القانونية",
560
+ "mitigation": "تنفيذ خطة سلامة شاملة وتدريب العاملين على إجراءات السلامة"
561
+ }
562
+ ],
563
+ "infrastructure": [
564
+ {
565
+ "risk": "تعارض مع مرافق تحت الأرض",
566
+ "type": "technical",
567
+ "severity": 4,
568
+ "probability": 3,
569
+ "impact": "إعادة التصميم وتأخير في الجدول الزمني",
570
+ "mitigation": "إجراء مسح شامل للمرافق تحت الأرض قبل بدء العمل"
571
+ },
572
+ {
573
+ "risk": "تأثير على حركة المرور والمناطق المحيطة",
574
+ "type": "technical",
575
+ "severity": 3,
576
+ "probability": 4,
577
+ "impact": "شكاوى من السكان والسلطات وتأخير في العمل",
578
+ "mitigation": "إعداد خطة إدارة حركة المرور والتواصل مع المجتمع المحلي"
579
+ },
580
+ {
581
+ "risk": "متطلبات بيئية غير متوقعة",
582
+ "type": "legal",
583
+ "severity": 4,
584
+ "probability": 3,
585
+ "impact": "تأخير في المشروع وتكاليف إضافية",
586
+ "mitigation": "إجراء تقييم بيئي شامل والتواصل مع الجهات البيئية"
587
+ }
588
+ ],
589
+ "technology": [
590
+ {
591
+ "risk": "مشاكل في تكامل النظام",
592
+ "type": "technical",
593
+ "severity": 4,
594
+ "probability": 3,
595
+ "impact": "عدم عمل النظام بشكل صحيح وتأخير في التسليم",
596
+ "mitigation": "إجراء اختبارات تكامل شاملة وإشراك مختصين في التكامل"
597
+ },
598
+ {
599
+ "risk": "تغيير في التكنولوجيا أثناء المشروع",
600
+ "type": "technical",
601
+ "severity": 3,
602
+ "probability": 3,
603
+ "impact": "تقادم الحلول المقترحة وزيادة التكاليف",
604
+ "mitigation": "اعتماد تقنيات مستقرة ومرونة في التصميم"
605
+ },
606
+ {
607
+ "risk": "مشاكل في أمن المعلومات",
608
+ "type": "technical",
609
+ "severity": 4,
610
+ "probability": 3,
611
+ "impact": "اختراقات أمنية ومسؤولية قانونية",
612
+ "mitigation": "تنفيذ معايير أمنية صارمة وإجراء اختبارات اختراق"
613
+ }
614
+ ],
615
+ "consulting": [
616
+ {
617
+ "risk": "عدم وضوح متطلبات العميل",
618
+ "type": "technical",
619
+ "severity": 3,
620
+ "probability": 4,
621
+ "impact": "إعادة العمل وعدم رضا العميل",
622
+ "mitigation": "توثيق المتطلبات بشكل تفصيلي واجتماعات منتظمة مع العميل"
623
+ },
624
+ {
625
+ "risk": "نقص في المعلومات اللازمة",
626
+ "type": "technical",
627
+ "severity": 3,
628
+ "probability": 3,
629
+ "impact": "تأخير في المشروع ومخرجات غير دقيقة",
630
+ "mitigation": "��حديد المعلومات المطلوبة مبكرًا والتواصل مع مصادر البيانات"
631
+ },
632
+ {
633
+ "risk": "مشاكل في قبول التسليمات",
634
+ "type": "technical",
635
+ "severity": 3,
636
+ "probability": 3,
637
+ "impact": "إعادة العمل وتأخير في الدفعات",
638
+ "mitigation": "تحديد معايير القبول بوضوح ومراجعات منتظمة مع العميل"
639
+ }
640
+ ],
641
+ "general": [
642
+ {
643
+ "risk": "مخاطر القوة القاهرة (كوارث طبيعية، أوبئة)",
644
+ "type": "technical",
645
+ "severity": 5,
646
+ "probability": 1,
647
+ "impact": "توقف المشروع بالكامل",
648
+ "mitigation": "إعداد خطة طوارئ وتضمين بند القوة القاهرة في العقود"
649
+ },
650
+ {
651
+ "risk": "تغييرات في اللوائح والأنظمة",
652
+ "type": "legal",
653
+ "severity": 3,
654
+ "probability": 2,
655
+ "impact": "تعديلات في التصميم وزيادة التكاليف",
656
+ "mitigation": "متابعة التحديثات التنظيمية والتشاور مع المستشارين القانونيين"
657
+ },
658
+ {
659
+ "risk": "مشاكل في التواصل مع أصحاب المصلحة",
660
+ "type": "technical",
661
+ "severity": 3,
662
+ "probability": 3,
663
+ "impact": "تأخيرات وسوء فهم وعدم رضا",
664
+ "mitigation": "إعداد خطة تواصل شاملة واجتماعات منتظمة مع أصحاب المصلحة"
665
+ }
666
+ ]
667
+ }
668
+ }