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)