|
""" |
|
خدمة حساب المحتوى المحلي |
|
""" |
|
import pandas as pd |
|
import numpy as np |
|
from datetime import datetime |
|
import os |
|
import config |
|
|
|
class LocalContentCalculator: |
|
"""خدمة حساب وتحسين المحتوى المحلي""" |
|
|
|
def __init__(self): |
|
"""تهيئة خدمة حساب المحتوى المحلي""" |
|
|
|
self.local_products = self._load_local_products() |
|
self.local_services = self._load_local_services() |
|
self.local_labor = self._load_local_labor() |
|
|
|
|
|
self.component_weights = { |
|
'القوى العاملة': 0.3, |
|
'المنتجات': 0.5, |
|
'الخدمات': 0.2 |
|
} |
|
|
|
|
|
self.targets = { |
|
'القوى العاملة': 0.8, |
|
'المنتجات': 0.7, |
|
'الخدمات': 0.6 |
|
} |
|
|
|
def _load_local_products(self): |
|
"""تحميل بيانات المنتجات المحلية ونسب المحتوى المحلي""" |
|
|
|
local_products = { |
|
'خرسانة': { |
|
'نسبة_المحتوى_المحلي': 0.95, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'منتج محلي بالكامل' |
|
}, |
|
'حديد تسليح': { |
|
'نسبة_المحتوى_المحلي': 0.70, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/مستورد', |
|
'ملاحظات': 'متوفر من مصانع محلية ومستورد' |
|
}, |
|
'عزل مائي': { |
|
'نسبة_المحتوى_المحلي': 0.60, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/مستورد', |
|
'ملاحظات': 'منتج محلي متوفر بجودة معقولة' |
|
}, |
|
'بلوك خرساني': { |
|
'نسبة_المحتوى_المحلي': 0.98, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'منتج محلي بالكامل' |
|
}, |
|
'رخام': { |
|
'نسبة_المحتوى_المحلي': 0.80, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'متوفر من محاجر محلية' |
|
}, |
|
'أثاث مكتبي': { |
|
'نسبة_المحتوى_المحلي': 0.75, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'يُصنع محليًا ويستخدم بعض المكونات المستوردة' |
|
}, |
|
'أجهزة تكييف': { |
|
'نسبة_المحتوى_المحلي': 0.40, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/مستورد', |
|
'ملاحظات': 'تجميع محلي مع مكونات مستوردة' |
|
}, |
|
'أنظمة إضاءة': { |
|
'نسبة_المحتوى_المحلي': 0.55, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/مستورد', |
|
'ملاحظات': 'متوفر محليًا وبجودة متفاوتة' |
|
}, |
|
'زجاج': { |
|
'نسبة_المحتوى_المحلي': 0.65, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/مستورد', |
|
'ملاحظات': 'إنتاج محلي بمواصفات جيدة' |
|
}, |
|
'أسلاك كهربائية': { |
|
'نسبة_المحتوى_المحلي': 0.85, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'تصنيع محلي بجودة عالية' |
|
} |
|
} |
|
|
|
|
|
try: |
|
file_path = os.path.join(config.DATA_DIR, 'local_products.csv') |
|
if os.path.exists(file_path): |
|
df = pd.read_csv(file_path, encoding='utf-8') |
|
local_products = {} |
|
for _, row in df.iterrows(): |
|
local_products[row['اسم_المنتج']] = { |
|
'نسبة_المحتوى_المحلي': row['نسبة_المحتوى_المحلي'], |
|
'بديل_محلي': row['بديل_محلي'], |
|
'مصدر': row['مصدر'], |
|
'ملاحظات': row['ملاحظات'] |
|
} |
|
except Exception as e: |
|
print(f"خطأ في تحميل بيانات المنتجات المحلية: {str(e)}") |
|
|
|
return local_products |
|
|
|
def _load_local_services(self): |
|
"""تحميل بيانات الخدمات المحلية ونسب المحتوى المحلي""" |
|
|
|
local_services = { |
|
'تصميم معماري': { |
|
'نسبة_المحتوى_المحلي': 0.90, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'متوفرة من مكاتب استشارية محلية' |
|
}, |
|
'إشراف هندسي': { |
|
'نسبة_المحتوى_المحلي': 0.85, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'متوفر من شركات محلية' |
|
}, |
|
'خدمات تنسيق المواقع': { |
|
'نسبة_المحتوى_المحلي': 0.80, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'شركات محلية متخصصة' |
|
}, |
|
'خدمات أمن وسلامة': { |
|
'نسبة_المحتوى_المحلي': 0.95, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'شركات محلية متخصصة' |
|
}, |
|
'استشارات بيئية': { |
|
'نسبة_المحتوى_المحلي': 0.65, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/دولي', |
|
'ملاحظات': 'متوفرة محليًا مع بعض الخبرات الأجنبية' |
|
}, |
|
'دراسات جدوى': { |
|
'نسبة_المحتوى_المحلي': 0.70, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/دولي', |
|
'ملاحظات': 'متوفرة من مكاتب استشارية محلية' |
|
}, |
|
'خدمات نقل': { |
|
'نسبة_المحتوى_المحلي': 0.90, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'شركات نقل محلية متعددة' |
|
}, |
|
'صيانة ونظافة': { |
|
'نسبة_المحتوى_المحلي': 0.95, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'شركات محلية متخصصة' |
|
} |
|
} |
|
|
|
|
|
try: |
|
file_path = os.path.join(config.DATA_DIR, 'local_services.csv') |
|
if os.path.exists(file_path): |
|
df = pd.read_csv(file_path, encoding='utf-8') |
|
local_services = {} |
|
for _, row in df.iterrows(): |
|
local_services[row['اسم_الخدمة']] = { |
|
'نسبة_المحتوى_المحلي': row['نسبة_المحتوى_المحلي'], |
|
'بديل_محلي': row['بديل_محلي'], |
|
'مصدر': row['مصدر'], |
|
'ملاحظات': row['ملاحظات'] |
|
} |
|
except Exception as e: |
|
print(f"خطأ في تحميل بيانات الخدمات المحلية: {str(e)}") |
|
|
|
return local_services |
|
|
|
def _load_local_labor(self): |
|
"""تحميل بيانات القوى العاملة المحلية ونسب المحتوى المحلي""" |
|
|
|
local_labor = { |
|
'عمال بناء': { |
|
'نسبة_المحتوى_المحلي': 0.60, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/أجنبي', |
|
'ملاحظات': 'متوفر محليًا مع نسبة من العمالة الأجنبية' |
|
}, |
|
'مهندسون': { |
|
'نسبة_المحتوى_المحلي': 0.75, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/أجنبي', |
|
'ملاحظات': 'كفاءات محلية متوفرة' |
|
}, |
|
'فنيون': { |
|
'نسبة_المحتوى_المحلي': 0.65, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/أجنبي', |
|
'ملاحظات': 'متوفر محليًا بنسب متفاوتة' |
|
}, |
|
'إداريون': { |
|
'نسبة_المحتوى_المحلي': 0.90, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'معظمهم من الكوادر المحلية' |
|
}, |
|
'مشرفون': { |
|
'نسبة_المحتوى_المحلي': 0.80, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي', |
|
'ملاحظات': 'معظمهم من الكوادر المحلية' |
|
}, |
|
'مصممون': { |
|
'نسبة_المحتوى_المحلي': 0.70, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/أجنبي', |
|
'ملاحظات': 'كفاءات محلية مع بعض الخبرات الأجنبية' |
|
}, |
|
'عمال مهرة': { |
|
'نسبة_المحتوى_المحلي': 0.55, |
|
'بديل_محلي': True, |
|
'مصدر': 'محلي/أجنبي', |
|
'ملاحظات': 'نسبة من العمالة الأجنبية ذات الخبرة' |
|
} |
|
} |
|
|
|
|
|
try: |
|
file_path = os.path.join(config.DATA_DIR, 'local_labor.csv') |
|
if os.path.exists(file_path): |
|
df = pd.read_csv(file_path, encoding='utf-8') |
|
local_labor = {} |
|
for _, row in df.iterrows(): |
|
local_labor[row['فئة_العمالة']] = { |
|
'نسبة_المحتوى_المحلي': row['نسبة_المحتوى_المحلي'], |
|
'بديل_محلي': row['بديل_محلي'], |
|
'مصدر': row['مصدر'], |
|
'ملاحظات': row['ملاحظات'] |
|
} |
|
except Exception as e: |
|
print(f"خطأ في تحميل بيانات القوى العاملة المحلية: {str(e)}") |
|
|
|
return local_labor |
|
|
|
def calculate_project_local_content(self, project_data): |
|
""" |
|
حساب نسبة المحتوى المحلي للمشروع |
|
|
|
المعلمات: |
|
project_data: بيانات المشروع، تتضمن مكونات المنتجات والخدمات والقوى العاملة |
|
|
|
إرجاع: |
|
نسبة المحتوى المحلي الإجمالية، وتفاصيل حسب كل مكون |
|
""" |
|
|
|
results = { |
|
'نسبة_المحتوى_المحلي_الإجمالية': 0, |
|
'تفاصيل_المكونات': { |
|
'المنتجات': {'نسبة': 0, 'تفاصيل': {}}, |
|
'الخدمات': {'نسبة': 0, 'تفاصيل': {}}, |
|
'القوى العاملة': {'نسبة': 0, 'تفاصيل': {}} |
|
}, |
|
'ملخص_المحتوى_المحلي': {}, |
|
'توصيات_التحسين': [] |
|
} |
|
|
|
|
|
if 'المنتجات' in project_data: |
|
products_local_content = self._calculate_products_local_content(project_data['المنتجات']) |
|
results['تفاصيل_المكونات']['المنتجات'] = products_local_content |
|
|
|
|
|
if 'الخدمات' in project_data: |
|
services_local_content = self._calculate_services_local_content(project_data['الخدمات']) |
|
results['تفاصيل_المكونات']['الخدمات'] = services_local_content |
|
|
|
|
|
if 'القوى العاملة' in project_data: |
|
labor_local_content = self._calculate_labor_local_content(project_data['القوى العاملة']) |
|
results['تفاصيل_المكونات']['القوى العاملة'] = labor_local_content |
|
|
|
|
|
total_local_content = 0 |
|
for component, weight in self.component_weights.items(): |
|
if component in results['تفاصيل_المكونات']: |
|
component_percentage = results['تفاصيل_المكونات'][component]['نسبة'] |
|
total_local_content += component_percentage * weight |
|
|
|
results['نسبة_المحتوى_المحلي_الإجمالية'] = total_local_content |
|
|
|
|
|
for component, target in self.targets.items(): |
|
if component in results['تفاصيل_المكونات']: |
|
actual = results['تفاصيل_المكونات'][component]['نسبة'] |
|
status = 'مطابق' if actual >= target else 'غير مطابق' |
|
gap = round((target - actual) * 100, 2) if actual < target else 0 |
|
|
|
results['ملخص_المحتوى_المحلي'][component] = { |
|
'المستهدف': target * 100, |
|
'الفعلي': round(actual * 100, 2), |
|
'الحالة': status, |
|
'الفجوة (%)': gap |
|
} |
|
|
|
|
|
results['توصيات_التحسين'] = self._generate_improvement_recommendations(results) |
|
|
|
return results |
|
|
|
def _calculate_products_local_content(self, products_data): |
|
""" |
|
حساب نسبة المحتوى المحلي للمنتجات |
|
|
|
المعلمات: |
|
products_data: بيانات المنتجات المستخدمة في المشروع |
|
|
|
إرجاع: |
|
تفاصيل نسبة المحتوى المحلي للمنتجات |
|
""" |
|
total_cost = 0 |
|
local_content_value = 0 |
|
details = {} |
|
|
|
for product_name, product_info in products_data.items(): |
|
quantity = product_info.get('الكمية', 0) |
|
unit_price = product_info.get('سعر_الوحدة', 0) |
|
total_product_cost = quantity * unit_price |
|
|
|
|
|
local_content_percentage = 0 |
|
if product_name in self.local_products: |
|
local_content_percentage = self.local_products[product_name]['نسبة_المحتوى_المحلي'] |
|
|
|
|
|
product_local_content_value = total_product_cost * local_content_percentage |
|
|
|
|
|
total_cost += total_product_cost |
|
local_content_value += product_local_content_value |
|
|
|
|
|
details[product_name] = { |
|
'الكمية': quantity, |
|
'سعر_الوحدة': unit_price, |
|
'التكلفة_الإجمالية': total_product_cost, |
|
'نسبة_المحتوى_المحلي': local_content_percentage, |
|
'قيمة_المحتوى_المحلي': product_local_content_value, |
|
'مصدر': self.local_products.get(product_name, {}).get('مصدر', 'غير معروف'), |
|
'ملاحظات': self.local_products.get(product_name, {}).get('ملاحظات', '') |
|
} |
|
|
|
|
|
local_content_percentage = local_content_value / total_cost if total_cost > 0 else 0 |
|
|
|
return { |
|
'نسبة': local_content_percentage, |
|
'إجمالي_التكلفة': total_cost, |
|
'قيمة_المحتوى_المحلي': local_content_value, |
|
'تفاصيل': details |
|
} |
|
|
|
def _calculate_services_local_content(self, services_data): |
|
""" |
|
حساب نسبة المحتوى المحلي للخدمات |
|
|
|
المعلمات: |
|
services_data: بيانات الخدمات المستخدمة في المشروع |
|
|
|
إرجاع: |
|
تفاصيل نسبة المحتوى المحلي للخدمات |
|
""" |
|
total_cost = 0 |
|
local_content_value = 0 |
|
details = {} |
|
|
|
for service_name, service_info in services_data.items(): |
|
cost = service_info.get('التكلفة', 0) |
|
|
|
|
|
local_content_percentage = 0 |
|
if service_name in self.local_services: |
|
local_content_percentage = self.local_services[service_name]['نسبة_المحتوى_المحلي'] |
|
|
|
|
|
service_local_content_value = cost * local_content_percentage |
|
|
|
|
|
total_cost += cost |
|
local_content_value += service_local_content_value |
|
|
|
|
|
details[service_name] = { |
|
'التكلفة': cost, |
|
'نسبة_المحتوى_المحلي': local_content_percentage, |
|
'قيمة_المحتوى_المحلي': service_local_content_value, |
|
'مصدر': self.local_services.get(service_name, {}).get('مصدر', 'غير معروف'), |
|
'ملاحظات': self.local_services.get(service_name, {}).get('ملاحظات', '') |
|
} |
|
|
|
|
|
local_content_percentage = local_content_value / total_cost if total_cost > 0 else 0 |
|
|
|
return { |
|
'نسبة': local_content_percentage, |
|
'إجمالي_التكلفة': total_cost, |
|
'قيمة_المحتوى_المحلي': local_content_value, |
|
'تفاصيل': details |
|
} |
|
|
|
def _calculate_labor_local_content(self, labor_data): |
|
""" |
|
حساب نسبة المحتوى المحلي للقوى العاملة |
|
|
|
المعلمات: |
|
labor_data: بيانات القوى العاملة المستخدمة في المشروع |
|
|
|
إرجاع: |
|
تفاصيل نسبة المحتوى المحلي للقوى العاملة |
|
""" |
|
total_cost = 0 |
|
local_content_value = 0 |
|
details = {} |
|
|
|
for labor_type, labor_info in labor_data.items(): |
|
count = labor_info.get('العدد', 0) |
|
monthly_salary = labor_info.get('الراتب_الشهري', 0) |
|
duration_months = labor_info.get('المدة_بالأشهر', 0) |
|
|
|
total_labor_cost = count * monthly_salary * duration_months |
|
|
|
|
|
local_content_percentage = 0 |
|
if labor_type in self.local_labor: |
|
local_content_percentage = self.local_labor[labor_type]['نسبة_المحتوى_المحلي'] |
|
|
|
|
|
labor_local_content_value = total_labor_cost * local_content_percentage |
|
|
|
|
|
total_cost += total_labor_cost |
|
local_content_value += labor_local_content_value |
|
|
|
|
|
details[labor_type] = { |
|
'العدد': count, |
|
'الراتب_الشهري': monthly_salary, |
|
'المدة_بالأشهر': duration_months, |
|
'التكلفة_الإجمالية': total_labor_cost, |
|
'نسبة_المحتوى_المحلي': local_content_percentage, |
|
'قيمة_المحتوى_المحلي': labor_local_content_value, |
|
'مصدر': self.local_labor.get(labor_type, {}).get('مصدر', 'غير معروف'), |
|
'ملاحظات': self.local_labor.get(labor_type, {}).get('ملاحظات', '') |
|
} |
|
|
|
|
|
local_content_percentage = local_content_value / total_cost if total_cost > 0 else 0 |
|
|
|
return { |
|
'نسبة': local_content_percentage, |
|
'إجمالي_التكلفة': total_cost, |
|
'قيمة_المحتوى_المحلي': local_content_value, |
|
'تفاصيل': details |
|
} |
|
|
|
def _generate_improvement_recommendations(self, results): |
|
""" |
|
توليد توصيات لتحسين نسبة المحتوى المحلي |
|
|
|
المعلمات: |
|
results: نتائج حساب المحتوى المحلي |
|
|
|
إرجاع: |
|
قائمة بالتوصيات لتحسين نسبة المحتوى المحلي |
|
""" |
|
recommendations = [] |
|
|
|
|
|
for component, summary in results['ملخص_المحتوى_المحلي'].items(): |
|
if summary['الحالة'] == 'غير مطابق': |
|
if component == 'المنتجات': |
|
|
|
low_content_products = [] |
|
for product, details in results['تفاصيل_المكونات']['المنتجات']['تفاصيل'].items(): |
|
if details['نسبة_المحتوى_المحلي'] < 0.5: |
|
low_content_products.append({ |
|
'اسم': product, |
|
'نسبة_المحتوى_المحلي': details['نسبة_المحتوى_المحلي'], |
|
'التكلفة_الإجمالية': details['التكلفة_الإجمالية'] |
|
}) |
|
|
|
elif component == 'الخدمات': |
|
|
|
low_content_services = [] |
|
for service, details in results['تفاصيل_المكونات']['الخدمات']['تفاصيل'].items(): |
|
if details['نسبة_المحتوى_المحلي'] < 0.5: |
|
low_content_services.append({ |
|
'اسم': service, |
|
'نسبة_المحتوى_المحلي': details['نسبة_المحتوى_المحلي'], |
|
'التكلفة': details['التكلفة'] |
|
}) |
|
|
|
elif component == 'القوى العاملة': |
|
|
|
low_content_labor = [] |
|
for labor_type, details in results['تفاصيل_المكونات']['القوى العاملة']['تفاصيل'].items(): |
|
if details['نسبة_المحتوى_المحلي'] < 0.5: |
|
low_content_labor.append({ |
|
'اسم': labor_type, |
|
'نسبة_المحتوى_المحلي': details['نسبة_المحتوى_المحلي'], |
|
'التكلفة_الإجمالية': details['التكلفة_الإجمالية'] |
|
}) |
|
|
|
|
|
|
|
if 'المنتجات' in results['ملخص_المحتوى_المحلي'] and results['ملخص_المحتوى_المحلي']['المنتجات']['الحالة'] == 'غير مطابق': |
|
low_content_products = [] |
|
for product, details in results['تفاصيل_المكونات']['المنتجات']['تفاصيل'].items(): |
|
if details['نسبة_المحتوى_المحلي'] < 0.5: |
|
low_content_products.append({ |
|
'اسم': product, |
|
'نسبة_المحتوى_المحلي': details['نسبة_المحتوى_المحلي'] |
|
}) |
|
|
|
if low_content_products: |
|
recommendations.append(f"استبدال المنتجات ذات المحتوى المحلي المنخفض: {', '.join([p['اسم'] for p in low_content_products[:3]])}") |
|
recommendations.append("البحث عن موردين محليين للمنتجات ذات الأولوية العالية") |
|
|
|
|
|
if 'الخدمات' in results['ملخص_المحتوى_المحلي'] and results['ملخص_المحتوى_المحلي']['الخدمات']['الحالة'] == 'غير مطابق': |
|
low_content_services = [] |
|
for service, details in results['تفاصيل_المكونات']['الخدمات']['تفاصيل'].items(): |
|
if details['نسبة_المحتوى_المحلي'] < 0.5: |
|
low_content_services.append({ |
|
'اسم': service, |
|
'نسبة_المحتوى_المحلي': details['نسبة_المحتوى_المحلي'] |
|
}) |
|
|
|
if low_content_services: |
|
recommendations.append(f"تحسين نسبة المحتوى المحلي للخدمات: {', '.join([s['اسم'] for s in low_content_services[:3]])}") |
|
recommendations.append("التعاقد مع شركات خدمية محلية") |
|
|
|
|
|
if 'القوى العاملة' in results['ملخص_المحتوى_المحلي'] and results['ملخص_المحتوى_المحلي']['القوى العاملة']['الحالة'] == 'غير مطابق': |
|
low_content_labor = [] |
|
for labor_type, details in results['تفاصيل_المكونات']['القوى العاملة']['تفاصيل'].items(): |
|
if details['نسبة_المحتوى_المحلي'] < 0.5: |
|
low_content_labor.append({ |
|
'اسم': labor_type, |
|
'نسبة_المحتوى_المحلي': details['نسبة_المحتوى_المحلي'] |
|
}) |
|
|
|
if low_content_labor: |
|
recommendations.append(f"زيادة توظيف العمالة المحلية في الفئات: {', '.join([l['اسم'] for l in low_content_labor[:3]])}") |
|
recommendations.append("الاستثمار في برامج تدريب وتأهيل الكوادر المحلية") |
|
|
|
|
|
if 'المنتجات' in results['ملخص_المحتوى_المحلي'] and results['ملخص_المحتوى_المحلي']['المنتجات'].get('الفجوة (%)', 0) > 10: |
|
recommendations.append(f"خطة تطوير المحتوى المحلي للمنتجات لتقليل الفجوة البالغة {results['ملخص_المحتوى_المحلي']['المنتجات']['الفجوة (%)']}%") |
|
|
|
if 'الخدمات' in results['ملخص_المحتوى_المحلي'] and results['ملخص_المحتوى_المحلي']['الخدمات'].get('الفجوة (%)', 0) > 10: |
|
recommendations.append(f"خطة تطوير المحتوى المحلي للخدمات لتقليل الفجوة البالغة {results['ملخص_المحتوى_المحلي']['الخدمات']['الفجوة (%)']}%") |
|
|
|
if 'القوى العاملة' in results['ملخص_المحتوى_المحلي'] and results['ملخص_المحتوى_المحلي']['القوى العاملة'].get('الفجوة (%)', 0) > 10: |
|
recommendations.append(f"خطة تطوير المحتوى المحلي للقوى العاملة لتقليل الفجوة البالغة {results['ملخص_المحتوى_المحلي']['القوى العاملة']['الفجوة (%)']}%") |
|
|
|
return recommendations |