Spaces:
Paused
Paused
Create web/pages/local_content.py
Browse files- web/pages/local_content.py +247 -1
web/pages/local_content.py
CHANGED
@@ -321,4 +321,250 @@ def show_local_content_calculator():
|
|
321 |
if labor_local_percentage < 70:
|
322 |
recommendations.append("زيادة نسبة العمالة المحلية من خلال التوظيف المباشر أو التعاقد مع شركات محلية.")
|
323 |
|
324 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
321 |
if labor_local_percentage < 70:
|
322 |
recommendations.append("زيادة نسبة العمالة المحلية من خلال التوظيف المباشر أو التعاقد مع شركات محلية.")
|
323 |
|
324 |
+
if materials_local_percentage < 50:
|
325 |
+
recommendations.append("زيادة نسبة المواد المحلية من خلال البحث عن موردين محليين أو استبدال المواد المستوردة بمواد محلية.")
|
326 |
+
|
327 |
+
if services_local_percentage < 60:
|
328 |
+
recommendations.append("الاعتماد بشكل أكبر على مقدمي الخدمات المحليين والاستعانة بالشركات الوطنية.")
|
329 |
+
|
330 |
+
if equipment_local_percentage < 30:
|
331 |
+
recommendations.append("محاولة استئجار المعدات من مصادر محلية بدلاً من شرائها من الخارج.")
|
332 |
+
|
333 |
+
for i, rec in enumerate(recommendations):
|
334 |
+
st.markdown(f"{i+1}. {rec}")
|
335 |
+
|
336 |
+
if not recommendations:
|
337 |
+
st.markdown("يمكن تحسين النسبة من خلال إعادة توزيع مكونات المشروع وزيادة الاعتماد على المصادر المحلية.")
|
338 |
+
|
339 |
+
def show_local_vendors():
|
340 |
+
"""
|
341 |
+
عرض الموردين المحليين
|
342 |
+
"""
|
343 |
+
st.markdown("## قاعدة بيانات الموردين المحليين")
|
344 |
+
|
345 |
+
# إنشاء بيانات توضيحية للموردين
|
346 |
+
vendors_data = {
|
347 |
+
"اسم المورد": [
|
348 |
+
"شركة الصناعات السعودية",
|
349 |
+
"مؤسسة الخليج للمقاولات",
|
350 |
+
"شركة الرياض للإنشاءات",
|
351 |
+
"الشركة العربية للمعدات",
|
352 |
+
"مصنع المنتجات الإسمنتية",
|
353 |
+
"شركة تقنيات البناء",
|
354 |
+
"مؤسسة المدار للتوريدات",
|
355 |
+
"شركة البنية التحتية المتكاملة",
|
356 |
+
"مصنع الصلب السعودي",
|
357 |
+
"شركة الأنابيب الوطنية"
|
358 |
+
],
|
359 |
+
"القطاع": [
|
360 |
+
"صناعة", "مقاولات", "إنشاءات", "معدات", "مواد بناء",
|
361 |
+
"تقنيات بناء", "توريدات", "بنية تحتية", "صناعات معدنية", "أنابيب"
|
362 |
+
],
|
363 |
+
"المنطقة": [
|
364 |
+
"الرياض", "الشرقية", "مكة المكرمة", "المدينة المنورة", "القصيم",
|
365 |
+
"الشرقية", "الرياض", "جدة", "ينبع", "الجبيل"
|
366 |
+
],
|
367 |
+
"تصنيف نطاقات": [
|
368 |
+
"بلاتيني", "أخضر مرتفع", "أخضر متوسط", "بلاتيني", "أخضر مرتفع",
|
369 |
+
"أخضر متوسط", "أخضر منخفض", "بلاتيني", "أخضر مرتفع", "أخضر متوسط"
|
370 |
+
],
|
371 |
+
"نسبة السعودة (%)": [
|
372 |
+
65, 42, 35, 55, 38, 30, 25, 60, 45, 40
|
373 |
+
],
|
374 |
+
"التقييم": [
|
375 |
+
4.8, 4.2, 3.9, 4.6, 4.0, 3.7, 3.5, 4.5, 4.3, 4.1
|
376 |
+
]
|
377 |
+
}
|
378 |
+
|
379 |
+
vendors_df = pd.DataFrame(vendors_data)
|
380 |
+
|
381 |
+
# البحث في قاعدة البيانات
|
382 |
+
st.markdown("### البحث في قاعدة بيانات الموردين")
|
383 |
+
|
384 |
+
col1, col2, col3 = st.columns(3)
|
385 |
+
|
386 |
+
with col1:
|
387 |
+
search_name = st.text_input("البحث باسم المورد", "")
|
388 |
+
|
389 |
+
with col2:
|
390 |
+
selected_sector = st.selectbox(
|
391 |
+
"القطاع",
|
392 |
+
["الكل"] + sorted(vendors_df["القطاع"].unique().tolist())
|
393 |
+
)
|
394 |
+
|
395 |
+
with col3:
|
396 |
+
selected_region = st.selectbox(
|
397 |
+
"المنطقة",
|
398 |
+
["الكل"] + sorted(vendors_df["المنطقة"].unique().tolist())
|
399 |
+
)
|
400 |
+
|
401 |
+
# تطبيق التصفية
|
402 |
+
filtered_df = vendors_df.copy()
|
403 |
+
|
404 |
+
if search_name:
|
405 |
+
filtered_df = filtered_df[filtered_df["اسم المورد"].str.contains(search_name, case=False)]
|
406 |
+
|
407 |
+
if selected_sector != "الكل":
|
408 |
+
filtered_df = filtered_df[filtered_df["القطاع"] == selected_sector]
|
409 |
+
|
410 |
+
if selected_region != "الكل":
|
411 |
+
filtered_df = filtered_df[filtered_df["المنطقة"] == selected_region]
|
412 |
+
|
413 |
+
# عرض نتائج البحث
|
414 |
+
st.markdown(f"### نتائج البحث ({len(filtered_df)} مورد)")
|
415 |
+
st.dataframe(filtered_df, use_container_width=True)
|
416 |
+
|
417 |
+
# عرض إحصائيات الموردين
|
418 |
+
st.markdown("### إحصائيات الموردين المحليين")
|
419 |
+
|
420 |
+
col1, col2 = st.columns(2)
|
421 |
+
|
422 |
+
with col1:
|
423 |
+
# توزيع الموردين حسب المنطقة
|
424 |
+
region_counts = vendors_df["المنطقة"].value_counts().reset_index()
|
425 |
+
region_counts.columns = ["المنطقة", "عدد الموردين"]
|
426 |
+
|
427 |
+
fig1 = px.pie(
|
428 |
+
region_counts,
|
429 |
+
values="عدد الموردين",
|
430 |
+
names="المنطقة",
|
431 |
+
title="توزيع الموردين حسب المنطقة",
|
432 |
+
color_discrete_sequence=px.colors.qualitative.Bold
|
433 |
+
)
|
434 |
+
|
435 |
+
fig1.update_traces(textposition="inside", textinfo="percent+label")
|
436 |
+
|
437 |
+
st.plotly_chart(fig1, use_container_width=True)
|
438 |
+
|
439 |
+
with col2:
|
440 |
+
# توزيع الموردين حسب تصنيف نطاقات
|
441 |
+
nitaqat_counts = vendors_df["تصنيف نطاقات"].value_counts().reset_index()
|
442 |
+
nitaqat_counts.columns = ["تصنيف نطاقات", "عدد الموردين"]
|
443 |
+
|
444 |
+
# ترتيب تصنيف نطاقات
|
445 |
+
nitaqat_order = {"بلاتيني": 1, "أخضر مرتفع": 2, "أخضر متوسط": 3, "أخضر منخفض": 4, "أصفر": 5, "أحمر": 6}
|
446 |
+
nitaqat_counts["الترتيب"] = nitaqat_counts["تصنيف نطاقات"].map(nitaqat_order)
|
447 |
+
nitaqat_counts = nitaqat_counts.sort_values("الترتيب")
|
448 |
+
|
449 |
+
# اختيار الألوان حسب التصنيف
|
450 |
+
nitaqat_colors = {
|
451 |
+
"بلاتيني": "#7B68EE", "أخضر مرتفع": "#228B22", "أخضر متوسط": "#32CD32",
|
452 |
+
"أخضر منخفض": "#90EE90", "أصفر": "#FFD700", "أحمر": "#FF4500"
|
453 |
+
}
|
454 |
+
|
455 |
+
fig2 = px.bar(
|
456 |
+
nitaqat_counts,
|
457 |
+
x="تصنيف نطاقات",
|
458 |
+
y="عدد الموردين",
|
459 |
+
color="تصنيف نطاقات",
|
460 |
+
color_discrete_map=nitaqat_colors,
|
461 |
+
title="توزيع الموردين حسب تصنيف نطاقات"
|
462 |
+
)
|
463 |
+
|
464 |
+
st.plotly_chart(fig2, use_container_width=True)
|
465 |
+
|
466 |
+
# قسم إضافة مورد جديد
|
467 |
+
st.markdown("### إضافة مورد جديد")
|
468 |
+
|
469 |
+
with st.expander("إضافة مورد جديد إلى قاعدة البيانات"):
|
470 |
+
col1, col2 = st.columns(2)
|
471 |
+
|
472 |
+
with col1:
|
473 |
+
new_vendor_name = st.text_input("اسم المورد")
|
474 |
+
new_vendor_sector = st.selectbox("القطاع", sorted(vendors_df["القطاع"].unique().tolist()))
|
475 |
+
new_vendor_region = st.selectbox("المنطقة", sorted(vendors_df["المنطقة"].unique().tolist()))
|
476 |
+
|
477 |
+
with col2:
|
478 |
+
new_vendor_nitaqat = st.selectbox(
|
479 |
+
"تصنيف نطاقات",
|
480 |
+
["بلاتيني", "أخضر مرتفع", "أخضر متوسط", "أخضر منخفض", "أصفر", "أحمر"]
|
481 |
+
)
|
482 |
+
new_vendor_saudization = st.slider("نسبة السعودة (%)", 0, 100, 30)
|
483 |
+
new_vendor_rating = st.slider("التقييم", 1.0, 5.0, 3.5, 0.1)
|
484 |
+
|
485 |
+
if st.button("إضافة المورد"):
|
486 |
+
st.success(f"تم إضافة المورد {new_vendor_name} بنجاح!")
|
487 |
+
|
488 |
+
def show_vision_requirements():
|
489 |
+
"""
|
490 |
+
عرض متطلبات رؤية 2030
|
491 |
+
"""
|
492 |
+
st.markdown("## متطلبات المحتوى المحلي في رؤية السعودية 2030")
|
493 |
+
|
494 |
+
# نص توضيحي
|
495 |
+
st.markdown("""
|
496 |
+
تعد زيادة المحتوى المحلي أحد الأهداف الاستراتيجية الرئيسية لرؤية السعودية 2030، وذلك من خلال:
|
497 |
+
|
498 |
+
- تعزيز المحتوى المحلي في المشتريات الحكومية
|
499 |
+
- دعم الصناعات الوطنية والمنتجات المحلية
|
500 |
+
- توطين الوظائف والتقنيات
|
501 |
+
- تطوير سلاسل الإمداد المحلية
|
502 |
+
- تعزيز المشاركة والاستثمار من القطاع الخاص
|
503 |
+
""")
|
504 |
+
|
505 |
+
# الأهداف الرئيسية
|
506 |
+
st.markdown("### الأهداف الرئيسية للمحتوى المحلي في رؤية 2030")
|
507 |
+
|
508 |
+
goals_data = {
|
509 |
+
"المؤشر": [
|
510 |
+
"نسبة المحتوى المحلي في القطاع غير النفطي",
|
511 |
+
"نسبة الإنفاق المحلي في المشتريات الحكومية",
|
512 |
+
"نسبة توطين الوظائف في القطاع الخاص",
|
513 |
+
"عدد المنشآت الصغيرة والمتوسطة المشاركة في سلاسل الإمداد",
|
514 |
+
"نسبة مساهمة المنشآت الصغيرة والمتوسطة في الناتج المحلي"
|
515 |
+
],
|
516 |
+
"الوضع الحالي": [35, 45, 26, 1200, 22],
|
517 |
+
"المستهدف 2025": [50, 60, 35, 3000, 30],
|
518 |
+
"المستهدف 2030": [70, 80, 60, 5000, 35]
|
519 |
+
}
|
520 |
+
|
521 |
+
goals_df = pd.DataFrame(goals_data)
|
522 |
+
|
523 |
+
st.table(goals_df)
|
524 |
+
|
525 |
+
# رسم بياني للأهداف
|
526 |
+
fig = go.Figure()
|
527 |
+
|
528 |
+
fig.add_trace(go.Bar(
|
529 |
+
x=goals_df["المؤشر"],
|
530 |
+
y=goals_df["الوضع الحالي"],
|
531 |
+
name="الوضع الحالي",
|
532 |
+
marker_color='#1976D2'
|
533 |
+
))
|
534 |
+
|
535 |
+
fig.add_trace(go.Bar(
|
536 |
+
x=goals_df["المؤشر"],
|
537 |
+
y=goals_df["المستهدف 2025"],
|
538 |
+
name="المستهدف 2025",
|
539 |
+
marker_color='#FFC107'
|
540 |
+
))
|
541 |
+
|
542 |
+
fig.add_trace(go.Bar(
|
543 |
+
x=goals_df["المؤشر"],
|
544 |
+
y=goals_df["المستهدف 2030"],
|
545 |
+
name="المستهدف 2030",
|
546 |
+
marker_color='#43A047'
|
547 |
+
))
|
548 |
+
|
549 |
+
fig.update_layout(
|
550 |
+
title="مؤشرات المحتوى المحلي في رؤية 2030",
|
551 |
+
xaxis_title="المؤشر",
|
552 |
+
yaxis_title="القيمة (%)",
|
553 |
+
barmode='group',
|
554 |
+
legend=dict(
|
555 |
+
orientation="h",
|
556 |
+
yanchor="bottom",
|
557 |
+
y=1.02,
|
558 |
+
xanchor="right",
|
559 |
+
x=1
|
560 |
+
)
|
561 |
+
)
|
562 |
+
|
563 |
+
st.plotly_chart(fig, use_container_width=True)
|
564 |
+
|
565 |
+
# متطلبات المحتوى المحلي حسب القطاع
|
566 |
+
st.markdown("### متطلبات المحتوى المحلي حسب القطاع")
|
567 |
+
|
568 |
+
sectors_data = {
|
569 |
+
"القطاع": ["النفط والغاز", "الكهرباء", "المياه", "الاتصالات", "النقل", "البناء والتشييد", "التعليم", "الصحة"],
|
570 |
+
"الحد الأدنى للم
|