Spaces:
Paused
Paused
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import plotly.express as px | |
| import plotly.graph_objects as go | |
| def show_local_content(): | |
| """ | |
| عرض صفحة تحليل المحتوى المحلي | |
| """ | |
| st.subheader("تحليل وتحسين المحتوى المحلي") | |
| # إنشاء القائمة الجانبية للخيارات | |
| options = st.sidebar.radio( | |
| "اختر القسم", | |
| ["تحليل المحتوى المحلي", "حاسبة المحتوى المحلي", "الموردون المحليون", "متطلبات رؤية 2030"] | |
| ) | |
| if options == "تحليل المحتوى المحلي": | |
| show_local_content_analysis() | |
| elif options == "حاسبة المحتوى المحلي": | |
| show_local_content_calculator() | |
| elif options == "الموردون المحليون": | |
| show_local_vendors() | |
| elif options == "متطلبات رؤية 2030": | |
| show_vision_requirements() | |
| def show_local_content_analysis(): | |
| """ | |
| عرض تحليل المحتوى المحلي | |
| """ | |
| st.markdown("## تحليل المحتوى المحلي") | |
| # عرض بيانات أداء المحتوى المحلي عبر المشاريع السابقة | |
| st.markdown("### أداء المحتوى المحلي في المشاريع السابقة") | |
| # إنشاء بيانات توضيحية | |
| projects_data = { | |
| "المشروع": [ | |
| "مشروع توسعة شبكة الطرق - الرياض", | |
| "بناء المدارس - المنطقة الشرقية", | |
| "تطوير البنية التحتية - جدة", | |
| "تحديث شبكة المياه - الدمام", | |
| "بناء المستشفى التخصصي - مكة", | |
| "إنشاء مركز البيانات - الرياض", | |
| "توسعة المطار - أبها", | |
| "تطوير الحدائق العامة - المدينة" | |
| ], | |
| "المحتوى المحلي المطلوب (%)": [40, 35, 45, 40, 50, 30, 45, 35], | |
| "المحتوى المحلي المحقق (%)": [47, 39, 52, 38, 53, 42, 48, 41], | |
| "القيمة (مليون ريال)": [120, 80, 150, 60, 200, 90, 110, 40] | |
| } | |
| projects_df = pd.DataFrame(projects_data) | |
| projects_df["الفرق"] = projects_df["المحتوى المحلي المحقق (%)"] - projects_df["المحتوى المحلي المطلوب (%)"] | |
| projects_df["حالة الامتثال"] = np.where(projects_df["الفرق"] >= 0, "ملتزم", "غير ملتزم") | |
| # عرض البيانات | |
| st.dataframe(projects_df, use_container_width=True) | |
| # رسم بياني لمقارنة المحتوى المحلي المطلوب والمحقق | |
| st.markdown("### مقارنة المحتوى المحلي المطلوب والمحقق") | |
| fig1 = go.Figure() | |
| fig1.add_trace(go.Bar( | |
| x=projects_df["المشروع"], | |
| y=projects_df["المحتوى المحلي المطلوب (%)"], | |
| name="المطلوب", | |
| marker_color='#1976D2' | |
| )) | |
| fig1.add_trace(go.Bar( | |
| x=projects_df["المشروع"], | |
| y=projects_df["المحتوى المحلي المحقق (%)"], | |
| name="المحقق", | |
| marker_color='#43A047' | |
| )) | |
| fig1.update_layout( | |
| title="مقارنة نسب المحتوى المحلي المطلوبة والمحققة", | |
| xaxis_title="المشروع", | |
| yaxis_title="نسبة المحتوى المحلي (%)", | |
| barmode='group', | |
| legend=dict( | |
| orientation="h", | |
| yanchor="bottom", | |
| y=1.02, | |
| xanchor="right", | |
| x=1 | |
| ) | |
| ) | |
| st.plotly_chart(fig1, use_container_width=True) | |
| # تحليل مكونات المحتوى المحلي | |
| st.markdown("### مكونات المحتوى المحلي (متوسط المشاريع)") | |
| components_data = { | |
| "المكون": ["العمالة المحلية", "المواد المحلية", "الخدمات المحلية", "الآلات والمعدات", "التدريب والتأهيل"], | |
| "النسبة (%)": [65, 45, 52, 38, 42] | |
| } | |
| components_df = pd.DataFrame(components_data) | |
| fig2 = px.pie( | |
| components_df, | |
| values="النسبة (%)", | |
| names="المكون", | |
| title="توزيع مكونات المحتوى المحلي", | |
| color_discrete_sequence=px.colors.qualitative.Bold | |
| ) | |
| fig2.update_traces(textposition="inside", textinfo="percent+label") | |
| st.plotly_chart(fig2, use_container_width=True) | |
| # تحليل اتجاهات المحتوى المحلي | |
| st.markdown("### اتجاهات المحتوى المحلي") | |
| years = [2020, 2021, 2022, 2023, 2024, 2025] | |
| trend_data = { | |
| "السنة": years, | |
| "متوسط المحتوى المحلي (%)": [42, 46, 51, 57, 63, 68], | |
| "الهدف (%)": [40, 45, 50, 55, 60, 70] | |
| } | |
| trend_df = pd.DataFrame(trend_data) | |
| fig3 = go.Figure() | |
| fig3.add_trace(go.Scatter( | |
| x=trend_df["السنة"], | |
| y=trend_df["متوسط المحتوى المحلي (%)"], | |
| mode='lines+markers', | |
| name="المحقق", | |
| line=dict(color='#43A047', width=3) | |
| )) | |
| fig3.add_trace(go.Scatter( | |
| x=trend_df["السنة"], | |
| y=trend_df["الهدف (%)"], | |
| mode='lines+markers', | |
| name="الهدف", | |
| line=dict(color='#1976D2', width=3, dash='dash') | |
| )) | |
| fig3.update_layout( | |
| title="اتجاهات المحتوى المحلي مقارنة بالأهداف", | |
| xaxis_title="السنة", | |
| yaxis_title="نسبة المحتوى المحلي (%)", | |
| legend=dict( | |
| orientation="h", | |
| yanchor="bottom", | |
| y=1.02, | |
| xanchor="right", | |
| x=1 | |
| ) | |
| ) | |
| st.plotly_chart(fig3, use_container_width=True) | |
| def show_local_content_calculator(): | |
| """ | |
| عرض حاسبة المحتوى المحلي | |
| """ | |
| st.markdown("## حاسبة المحتوى المحلي") | |
| st.markdown(""" | |
| هذه الحاسبة تساعدك على تقدير نسبة المحتوى المحلي لمشروعك بناءً على مكونات المشروع المختلفة. | |
| يرجى إدخال القيم التقديرية لكل مكون. | |
| """) | |
| # قسم إدخال البيانات | |
| st.markdown("### بيانات المشروع") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| project_name = st.text_input("اسم المشروع", "مشروع جديد") | |
| total_budget = st.number_input("إجمالي قيمة المشروع (مليون ريال)", min_value=1.0, max_value=1000.0, value=100.0) | |
| with col2: | |
| local_content_target = st.number_input("نسبة المحتوى المحلي المستهدفة (%)", min_value=10, max_value=100, value=50) | |
| project_duration = st.number_input("مدة المشروع (بالأشهر)", min_value=1, max_value=60, value=12) | |
| # مكونات المحتوى المحلي | |
| st.markdown("### مكونات المشروع") | |
| # العمالة | |
| st.markdown("#### العمالة") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| labor_local_percentage = st.slider("نسبة العمالة المحلية (%)", 0, 100, 60) | |
| with col2: | |
| labor_cost_percentage = st.slider("نسبة تكلفة العمالة من إجمالي المشروع (%)", 0, 100, 30) | |
| with col3: | |
| labor_cost = total_budget * (labor_cost_percentage / 100) | |
| labor_local_value = labor_cost * (labor_local_percentage / 100) | |
| st.metric( | |
| label="قيمة العمالة المحلية (مليون ريال)", | |
| value=f"{labor_local_value:.2f}" | |
| ) | |
| # المواد | |
| st.markdown("#### المواد") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| materials_local_percentage = st.slider("نسبة المواد المحلية (%)", 0, 100, 40) | |
| with col2: | |
| materials_cost_percentage = st.slider("نسبة تكلفة المواد من إجمالي المشروع (%)", 0, 100, 40) | |
| with col3: | |
| materials_cost = total_budget * (materials_cost_percentage / 100) | |
| materials_local_value = materials_cost * (materials_local_percentage / 100) | |
| st.metric( | |
| label="قيمة المواد المحلية (مليون ريال)", | |
| value=f"{materials_local_value:.2f}" | |
| ) | |
| # الخدمات | |
| st.markdown("#### الخدمات") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| services_local_percentage = st.slider("نسبة الخدمات المحلية (%)", 0, 100, 50) | |
| with col2: | |
| services_cost_percentage = st.slider("نسبة تكلفة الخدمات من إجمالي المشروع (%)", 0, 100, 20) | |
| with col3: | |
| services_cost = total_budget * (services_cost_percentage / 100) | |
| services_local_value = services_cost * (services_local_percentage / 100) | |
| st.metric( | |
| label="قيمة الخدمات المحلية (مليون ريال)", | |
| value=f"{services_local_value:.2f}" | |
| ) | |
| # المعدات | |
| st.markdown("#### المعدات والآلات") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| equipment_local_percentage = st.slider("نسبة المعدات المحلية (%)", 0, 100, 25) | |
| with col2: | |
| equipment_cost_percentage = st.slider("نسبة تكلفة المعدات من إجمالي المشروع (%)", 0, 100, 10) | |
| with col3: | |
| equipment_cost = total_budget * (equipment_cost_percentage / 100) | |
| equipment_local_value = equipment_cost * (equipment_local_percentage / 100) | |
| st.metric( | |
| label="قيمة المعدات المحلية (مليون ريال)", | |
| value=f"{equipment_local_value:.2f}" | |
| ) | |
| # حساب نسبة المحتوى المحلي الإجمالية | |
| total_local_value = labor_local_value + materials_local_value + services_local_value + equipment_local_value | |
| actual_local_content = (total_local_value / total_budget) * 100 | |
| st.markdown("### نتائج حساب المحتوى المحلي") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| st.metric( | |
| label="إجمالي قيمة المشروع (مليون ريال)", | |
| value=f"{total_budget:.2f}" | |
| ) | |
| with col2: | |
| st.metric( | |
| label="قيمة المحتوى المحلي (مليون ريال)", | |
| value=f"{total_local_value:.2f}" | |
| ) | |
| with col3: | |
| st.metric( | |
| label="نسبة المحتوى المحلي المحققة (%)", | |
| value=f"{actual_local_content:.2f}", | |
| delta=f"{actual_local_content - local_content_target:.2f}" | |
| ) | |
| # رسم بياني لتوزيع المحتوى المحلي | |
| components_values = [labor_local_value, materials_local_value, services_local_value, equipment_local_value] | |
| components_labels = ["العمالة", "المواد", "الخدمات", "المعدات والآلات"] | |
| fig = px.pie( | |
| names=components_labels, | |
| values=components_values, | |
| title="توزيع قيمة المحتوى المحلي حسب المكونات", | |
| color_discrete_sequence=px.colors.qualitative.Bold | |
| ) | |
| fig.update_traces(textposition="inside", textinfo="percent+value") | |
| st.plotly_chart(fig, use_container_width=True) | |
| # حالة الامتثال للمتطلبات | |
| st.markdown("### حالة الامتثال لمتطلبات المحتوى المحلي") | |
| if actual_local_content >= local_content_target: | |
| st.success(f"المشروع يلبي متطلبات المحتوى المحلي (الفائض: {actual_local_content - local_content_target:.2f}%)") | |
| else: | |
| st.error(f"المشروع لا يلبي متطلبات المحتوى المحلي (العجز: {local_content_target - actual_local_content:.2f}%)") | |
| # توصيات لتحسين نسبة المحتوى المحلي | |
| st.markdown("### توصيات لتحسين نسبة المحتوى المحلي") | |
| recommendations = [] | |
| if labor_local_percentage < 70: | |
| recommendations.append("زيادة نسبة العمالة المحلية من خلال التوظيف المباشر أو التعاقد مع شركات محلية.") | |
| if materials_local_percentage < 50: | |
| recommendations.append("زيادة نسبة المواد المحلية من خلال البحث عن موردين محليين أو استبدال المواد المستوردة بمواد محلية.") | |
| if services_local_percentage < 60: | |
| recommendations.append("الاعتماد بشكل أكبر على مقدمي الخدمات المحليين والاستعانة بالشركات الوطنية.") | |
| if equipment_local_percentage < 30: | |
| recommendations.append("محاولة استئجار المعدات من مصادر محلية بدلاً من شرائها من الخارج.") | |
| for i, rec in enumerate(recommendations): | |
| st.markdown(f"{i+1}. {rec}") | |
| if not recommendations: | |
| st.markdown("يمكن تحسين النسبة من خلال إعادة توزيع مكونات المشروع وزيادة الاعتماد على المصادر المحلية.") | |
| def show_local_vendors(): | |
| """ | |
| عرض الموردين المحليين | |
| """ | |
| st.markdown("## قاعدة بيانات الموردين المحليين") | |
| # إنشاء بيانات توضيحية للموردين | |
| vendors_data = { | |
| "اسم المورد": [ | |
| "شركة الصناعات السعودية", | |
| "مؤسسة الخليج للمقاولات", | |
| "شركة الرياض للإنشاءات", | |
| "الشركة العربية للمعدات", | |
| "مصنع المنتجات الإسمنتية", | |
| "شركة تقنيات البناء", | |
| "مؤسسة المدار للتوريدات", | |
| "شركة البنية التحتية المتكاملة", | |
| "مصنع الصلب السعودي", | |
| "شركة الأنابيب الوطنية" | |
| ], | |
| "القطاع": [ | |
| "صناعة", "مقاولات", "إنشاءات", "معدات", "مواد بناء", | |
| "تقنيات بناء", "توريدات", "بنية تحتية", "صناعات معدنية", "أنابيب" | |
| ], | |
| "المنطقة": [ | |
| "الرياض", "الشرقية", "مكة المكرمة", "المدينة المنورة", "القصيم", | |
| "الشرقية", "الرياض", "جدة", "ينبع", "الجبيل" | |
| ], | |
| "تصنيف نطاقات": [ | |
| "بلاتيني", "أخضر مرتفع", "أخضر متوسط", "بلاتيني", "أخضر مرتفع", | |
| "أخضر متوسط", "أخضر منخفض", "بلاتيني", "أخضر مرتفع", "أخضر متوسط" | |
| ], | |
| "نسبة السعودة (%)": [ | |
| 65, 42, 35, 55, 38, 30, 25, 60, 45, 40 | |
| ], | |
| "التقييم": [ | |
| 4.8, 4.2, 3.9, 4.6, 4.0, 3.7, 3.5, 4.5, 4.3, 4.1 | |
| ] | |
| } | |
| vendors_df = pd.DataFrame(vendors_data) | |
| # البحث في قاعدة البيانات | |
| st.markdown("### البحث في قاعدة بيانات الموردين") | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| search_name = st.text_input("البحث باسم المورد", "") | |
| with col2: | |
| selected_sector = st.selectbox( | |
| "القطاع", | |
| ["الكل"] + sorted(vendors_df["القطاع"].unique().tolist()) | |
| ) | |
| with col3: | |
| selected_region = st.selectbox( | |
| "المنطقة", | |
| ["الكل"] + sorted(vendors_df["المنطقة"].unique().tolist()) | |
| ) | |
| # تطبيق التصفية | |
| filtered_df = vendors_df.copy() | |
| if search_name: | |
| filtered_df = filtered_df[filtered_df["اسم المورد"].str.contains(search_name, case=False)] | |
| if selected_sector != "الكل": | |
| filtered_df = filtered_df[filtered_df["القطاع"] == selected_sector] | |
| if selected_region != "الكل": | |
| filtered_df = filtered_df[filtered_df["المنطقة"] == selected_region] | |
| # عرض نتائج البحث | |
| st.markdown(f"### نتائج البحث ({len(filtered_df)} مورد)") | |
| st.dataframe(filtered_df, use_container_width=True) | |
| # عرض إحصائيات الموردين | |
| st.markdown("### إحصائيات الموردين المحليين") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| # توزيع الموردين حسب المنطقة | |
| region_counts = vendors_df["المنطقة"].value_counts().reset_index() | |
| region_counts.columns = ["المنطقة", "عدد الموردين"] | |
| fig1 = px.pie( | |
| region_counts, | |
| values="عدد الموردين", | |
| names="المنطقة", | |
| title="توزيع الموردين حسب المنطقة", | |
| color_discrete_sequence=px.colors.qualitative.Bold | |
| ) | |
| fig1.update_traces(textposition="inside", textinfo="percent+label") | |
| st.plotly_chart(fig1, use_container_width=True) | |
| with col2: | |
| # توزيع الموردين حسب تصنيف نطاقات | |
| nitaqat_counts = vendors_df["تصنيف نطاقات"].value_counts().reset_index() | |
| nitaqat_counts.columns = ["تصنيف نطاقات", "عدد الموردين"] | |
| # ترتيب تصنيف نطاقات | |
| nitaqat_order = {"بلاتيني": 1, "أخضر مرتفع": 2, "أخضر متوسط": 3, "أخضر منخفض": 4, "أصفر": 5, "أحمر": 6} | |
| nitaqat_counts["الترتيب"] = nitaqat_counts["تصنيف نطاقات"].map(nitaqat_order) | |
| nitaqat_counts = nitaqat_counts.sort_values("الترتيب") | |
| # اختيار الألوان حسب التصنيف | |
| nitaqat_colors = { | |
| "بلاتيني": "#7B68EE", "أخضر مرتفع": "#228B22", "أخضر متوسط": "#32CD32", | |
| "أخضر منخفض": "#90EE90", "أصفر": "#FFD700", "أحمر": "#FF4500" | |
| } | |
| fig2 = px.bar( | |
| nitaqat_counts, | |
| x="تصنيف نطاقات", | |
| y="عدد الموردين", | |
| color="تصنيف نطاقات", | |
| color_discrete_map=nitaqat_colors, | |
| title="توزيع الموردين حسب تصنيف نطاقات" | |
| ) | |
| st.plotly_chart(fig2, use_container_width=True) | |
| # قسم إضافة مورد جديد | |
| st.markdown("### إضافة مورد جديد") | |
| with st.expander("إضافة مورد جديد إلى قاعدة البيانات"): | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| new_vendor_name = st.text_input("اسم المورد") | |
| new_vendor_sector = st.selectbox("القطاع", sorted(vendors_df["القطاع"].unique().tolist())) | |
| new_vendor_region = st.selectbox("المنطقة", sorted(vendors_df["المنطقة"].unique().tolist())) | |
| with col2: | |
| new_vendor_nitaqat = st.selectbox( | |
| "تصنيف نطاقات", | |
| ["بلاتيني", "أخضر مرتفع", "أخضر متوسط", "أخضر منخفض", "أصفر", "أحمر"] | |
| ) | |
| new_vendor_saudization = st.slider("نسبة السعودة (%)", 0, 100, 30) | |
| new_vendor_rating = st.slider("التقييم", 1.0, 5.0, 3.5, 0.1) | |
| if st.button("إضافة المورد"): | |
| st.success(f"تم إضافة المورد {new_vendor_name} بنجاح!") | |
| def show_vision_requirements(): | |
| """ | |
| عرض متطلبات رؤية 2030 | |
| """ | |
| st.markdown("## متطلبات المحتوى المحلي في رؤية السعودية 2030") | |
| # نص توضيحي | |
| st.markdown(""" | |
| تعد زيادة المحتوى المحلي أحد الأهداف الاستراتيجية الرئيسية لرؤية السعودية 2030، وذلك من خلال: | |
| - تعزيز المحتوى المحلي في المشتريات الحكومية | |
| - دعم الصناعات الوطنية والمنتجات المحلية | |
| - توطين الوظائف والتقنيات | |
| - تطوير سلاسل الإمداد المحلية | |
| - تعزيز المشاركة والاستثمار من القطاع الخاص | |
| """) | |
| # الأهداف الرئيسية | |
| st.markdown("### الأهداف الرئيسية للمحتوى المحلي في رؤية 2030") | |
| goals_data = { | |
| "المؤشر": [ | |
| "نسبة المحتوى المحلي في القطاع غير النفطي", | |
| "نسبة الإنفاق المحلي في المشتريات الحكومية", | |
| "نسبة توطين الوظائف في القطاع الخاص", | |
| "عدد المنشآت الصغيرة والمتوسطة المشاركة في سلاسل الإمداد", | |
| "نسبة مساهمة المنشآت الصغيرة والمتوسطة في الناتج المحلي" | |
| ], | |
| "الوضع الحالي": [35, 45, 26, 1200, 22], | |
| "المستهدف 2025": [50, 60, 35, 3000, 30], | |
| "المستهدف 2030": [70, 80, 60, 5000, 35] | |
| } | |
| goals_df = pd.DataFrame(goals_data) | |
| st.table(goals_df) | |
| # رسم بياني للأهداف | |
| fig = go.Figure() | |
| fig.add_trace(go.Bar( | |
| x=goals_df["المؤشر"], | |
| y=goals_df["الوضع الحالي"], | |
| name="الوضع الحالي", | |
| marker_color='#1976D2' | |
| )) | |
| fig.add_trace(go.Bar( | |
| x=goals_df["المؤشر"], | |
| y=goals_df["المستهدف 2025"], | |
| name="المستهدف 2025", | |
| marker_color='#FFC107' | |
| )) | |
| fig.add_trace(go.Bar( | |
| x=goals_df["المؤشر"], | |
| y=goals_df["المستهدف 2030"], | |
| name="المستهدف 2030", | |
| marker_color='#43A047' | |
| )) | |
| fig.update_layout( | |
| title="مؤشرات المحتوى المحلي في رؤية 2030", | |
| xaxis_title="المؤشر", | |
| yaxis_title="القيمة (%)", | |
| barmode='group', | |
| legend=dict( | |
| orientation="h", | |
| yanchor="bottom", | |
| y=1.02, | |
| xanchor="right", | |
| x=1 | |
| ) | |
| ) | |
| st.plotly_chart(fig, use_container_width=True) | |
| # متطلبات المحتوى المحلي حسب القطاع | |
| st.markdown("### متطلبات المحتوى المحلي حسب القطاع") | |
| # بيانات القطاعات | |
| sectors_data = { | |
| "القطاع": ["النفط والغاز", "الكهرباء", "المياه", "الاتصالات", "النقل", "البناء والتشييد"], | |
| "نسبة المحتوى المحلي المطلوبة": ["50%", "40%", "45%", "35%", "30%", "25%"] | |
| } | |
| # إنشاء DataFrame | |
| df = pd.DataFrame(sectors_data) | |
| # عرض الجدول في Streamlit | |
| st.dataframe(df) |