Spaces:
Sleeping
Sleeping
""" | |
ุฎุฏู ุฉ ุญุณุงุจ ุงูู ุญุชูู ุงูู ุญูู | |
""" | |
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 |