SA-SAJCOAI / modules /pricing /services /local_content_calculator.py
EGYADMIN's picture
Upload 75 files
fb20480 verified
"""
ุฎุฏู…ุฉ ุญุณุงุจ ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ
"""
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, # 30% ู…ู† ูˆุฒู† ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ
'ุงู„ู…ู†ุชุฌุงุช': 0.5, # 50% ู…ู† ูˆุฒู† ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ
'ุงู„ุฎุฏู…ุงุช': 0.2 # 20% ู…ู† ูˆุฒู† ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ
}
# ุชุญุฏูŠุฏ ุงู„ู…ุณุชู‡ุฏูุงุช (ู…ุชุทู„ุจุงุช ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ)
self.targets = {
'ุงู„ู‚ูˆู‰ ุงู„ุนุงู…ู„ุฉ': 0.8, # 80% ู…ุญุชูˆู‰ ู…ุญู„ูŠ ู„ู„ู‚ูˆู‰ ุงู„ุนุงู…ู„ุฉ
'ุงู„ู…ู†ุชุฌุงุช': 0.7, # 70% ู…ุญุชูˆู‰ ู…ุญู„ูŠ ู„ู„ู…ู†ุชุฌุงุช
'ุงู„ุฎุฏู…ุงุช': 0.6 # 60% ู…ุญุชูˆู‰ ู…ุญู„ูŠ ู„ู„ุฎุฏู…ุงุช
}
def _load_local_products(self):
"""ุชุญู…ูŠู„ ุจูŠุงู†ุงุช ุงู„ู…ู†ุชุฌุงุช ุงู„ู…ุญู„ูŠุฉ ูˆู†ุณุจ ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ"""
# ู…ุญุงูƒุงุฉ ุชุญู…ูŠู„ ุงู„ุจูŠุงู†ุงุช ู…ู† ู…ุตุฏุฑ ุจูŠุงู†ุงุช
local_products = {
'ุฎุฑุณุงู†ุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.95, # 95% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ู†ุชุฌ ู…ุญู„ูŠ ุจุงู„ูƒุงู…ู„'
},
'ุญุฏูŠุฏ ุชุณู„ูŠุญ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.70, # 70% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ู…ุณุชูˆุฑุฏ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑ ู…ู† ู…ุตุงู†ุน ู…ุญู„ูŠุฉ ูˆู…ุณุชูˆุฑุฏ'
},
'ุนุฒู„ ู…ุงุฆูŠ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.60, # 60% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ู…ุณุชูˆุฑุฏ',
'ู…ู„ุงุญุธุงุช': 'ู…ู†ุชุฌ ู…ุญู„ูŠ ู…ุชูˆูุฑ ุจุฌูˆุฏุฉ ู…ุนู‚ูˆู„ุฉ'
},
'ุจู„ูˆูƒ ุฎุฑุณุงู†ูŠ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.98, # 98% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ู†ุชุฌ ู…ุญู„ูŠ ุจุงู„ูƒุงู…ู„'
},
'ุฑุฎุงู…': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.80, # 80% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑ ู…ู† ู…ุญุงุฌุฑ ู…ุญู„ูŠุฉ'
},
'ุฃุซุงุซ ู…ูƒุชุจูŠ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.75, # 75% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ูŠูุตู†ุน ู…ุญู„ูŠู‹ุง ูˆูŠุณุชุฎุฏู… ุจุนุถ ุงู„ู…ูƒูˆู†ุงุช ุงู„ู…ุณุชูˆุฑุฏุฉ'
},
'ุฃุฌู‡ุฒุฉ ุชูƒูŠูŠู': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.40, # 40% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ู…ุณุชูˆุฑุฏ',
'ู…ู„ุงุญุธุงุช': 'ุชุฌู…ูŠุน ู…ุญู„ูŠ ู…ุน ู…ูƒูˆู†ุงุช ู…ุณุชูˆุฑุฏุฉ'
},
'ุฃู†ุธู…ุฉ ุฅุถุงุกุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.55, # 55% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ู…ุณุชูˆุฑุฏ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑ ู…ุญู„ูŠู‹ุง ูˆุจุฌูˆุฏุฉ ู…ุชูุงูˆุชุฉ'
},
'ุฒุฌุงุฌ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.65, # 65% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ู…ุณุชูˆุฑุฏ',
'ู…ู„ุงุญุธุงุช': 'ุฅู†ุชุงุฌ ู…ุญู„ูŠ ุจู…ูˆุงุตูุงุช ุฌูŠุฏุฉ'
},
'ุฃุณู„ุงูƒ ูƒู‡ุฑุจุงุฆูŠุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.85, # 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, # 90% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑุฉ ู…ู† ู…ูƒุงุชุจ ุงุณุชุดุงุฑูŠุฉ ู…ุญู„ูŠุฉ'
},
'ุฅุดุฑุงู ู‡ู†ุฏุณูŠ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.85, # 85% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑ ู…ู† ุดุฑูƒุงุช ู…ุญู„ูŠุฉ'
},
'ุฎุฏู…ุงุช ุชู†ุณูŠู‚ ุงู„ู…ูˆุงู‚ุน': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.80, # 80% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ุดุฑูƒุงุช ู…ุญู„ูŠุฉ ู…ุชุฎุตุตุฉ'
},
'ุฎุฏู…ุงุช ุฃู…ู† ูˆุณู„ุงู…ุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.95, # 95% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ุดุฑูƒุงุช ู…ุญู„ูŠุฉ ู…ุชุฎุตุตุฉ'
},
'ุงุณุชุดุงุฑุงุช ุจูŠุฆูŠุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.65, # 65% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ุฏูˆู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑุฉ ู…ุญู„ูŠู‹ุง ู…ุน ุจุนุถ ุงู„ุฎุจุฑุงุช ุงู„ุฃุฌู†ุจูŠุฉ'
},
'ุฏุฑุงุณุงุช ุฌุฏูˆู‰': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.70, # 70% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ุฏูˆู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑุฉ ู…ู† ู…ูƒุงุชุจ ุงุณุชุดุงุฑูŠุฉ ู…ุญู„ูŠุฉ'
},
'ุฎุฏู…ุงุช ู†ู‚ู„': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.90, # 90% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ุดุฑูƒุงุช ู†ู‚ู„ ู…ุญู„ูŠุฉ ู…ุชุนุฏุฏุฉ'
},
'ุตูŠุงู†ุฉ ูˆู†ุธุงูุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.95, # 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, # 60% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ุฃุฌู†ุจูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑ ู…ุญู„ูŠู‹ุง ู…ุน ู†ุณุจุฉ ู…ู† ุงู„ุนู…ุงู„ุฉ ุงู„ุฃุฌู†ุจูŠุฉ'
},
'ู…ู‡ู†ุฏุณูˆู†': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.75, # 75% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ุฃุฌู†ุจูŠ',
'ู…ู„ุงุญุธุงุช': 'ูƒูุงุกุงุช ู…ุญู„ูŠุฉ ู…ุชูˆูุฑุฉ'
},
'ูู†ูŠูˆู†': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.65, # 65% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ุฃุฌู†ุจูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุชูˆูุฑ ู…ุญู„ูŠู‹ุง ุจู†ุณุจ ู…ุชูุงูˆุชุฉ'
},
'ุฅุฏุงุฑูŠูˆู†': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.90, # 90% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุนุธู…ู‡ู… ู…ู† ุงู„ูƒูˆุงุฏุฑ ุงู„ู…ุญู„ูŠุฉ'
},
'ู…ุดุฑููˆู†': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.80, # 80% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ',
'ู…ู„ุงุญุธุงุช': 'ู…ุนุธู…ู‡ู… ู…ู† ุงู„ูƒูˆุงุฏุฑ ุงู„ู…ุญู„ูŠุฉ'
},
'ู…ุตู…ู…ูˆู†': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.70, # 70% ู…ุญุชูˆู‰ ู…ุญู„ูŠ
'ุจุฏูŠู„_ู…ุญู„ูŠ': True,
'ู…ุตุฏุฑ': 'ู…ุญู„ูŠ/ุฃุฌู†ุจูŠ',
'ู…ู„ุงุญุธุงุช': 'ูƒูุงุกุงุช ู…ุญู„ูŠุฉ ู…ุน ุจุนุถ ุงู„ุฎุจุฑุงุช ุงู„ุฃุฌู†ุจูŠุฉ'
},
'ุนู…ุงู„ ู…ู‡ุฑุฉ': {
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': 0.55, # 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: # ุฃู‚ู„ ู…ู† 50%
low_content_products.append({
'ุงุณู…': product,
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': details['ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ'],
'ุงู„ุชูƒู„ูุฉ_ุงู„ุฅุฌู…ุงู„ูŠุฉ': details['ุงู„ุชูƒู„ูุฉ_ุงู„ุฅุฌู…ุงู„ูŠุฉ']
})
elif component == 'ุงู„ุฎุฏู…ุงุช':
# ุชุญุฏูŠุฏ ุงู„ุจู†ูˆุฏ ุฐุงุช ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ ุงู„ู…ู†ุฎูุถ
low_content_services = []
for service, details in results['ุชูุงุตูŠู„_ุงู„ู…ูƒูˆู†ุงุช']['ุงู„ุฎุฏู…ุงุช']['ุชูุงุตูŠู„'].items():
if details['ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ'] < 0.5: # ุฃู‚ู„ ู…ู† 50%
low_content_services.append({
'ุงุณู…': service,
'ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ': details['ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ'],
'ุงู„ุชูƒู„ูุฉ': details['ุงู„ุชูƒู„ูุฉ']
})
elif component == 'ุงู„ู‚ูˆู‰ ุงู„ุนุงู…ู„ุฉ':
# ุชุญุฏูŠุฏ ูุฆุงุช ุงู„ุนู…ุงู„ุฉ ุฐุงุช ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญู„ูŠ ุงู„ู…ู†ุฎูุถ
low_content_labor = []
for labor_type, details in results['ุชูุงุตูŠู„_ุงู„ู…ูƒูˆู†ุงุช']['ุงู„ู‚ูˆู‰ ุงู„ุนุงู…ู„ุฉ']['ุชูุงุตูŠู„'].items():
if details['ู†ุณุจุฉ_ุงู„ู…ุญุชูˆู‰_ุงู„ู…ุญู„ูŠ'] < 0.5: # ุฃู‚ู„ ู…ู† 50%
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