""" خدمة التسعير القياسي """ import pandas as pd import numpy as np from datetime import datetime import os import config class StandardPricing: """خدمة التسعير القياسي للبنود""" def __init__(self): """تهيئة خدمة التسعير القياسي""" # تحميل بيانات المواد والأسعار المرجعية self.material_prices = self._load_material_prices() self.labor_rates = self._load_labor_rates() self.equipment_rates = self._load_equipment_rates() def _load_material_prices(self): """تحميل أسعار المواد""" # محاكاة تحميل البيانات من مصدر بيانات material_prices = { 'خرسانة': { 'م3': 750.0, # سعر المتر المكعب بالريال 'وحدة_قياسية': 'م3', 'آخر_تحديث': datetime(2025, 3, 1) }, 'حديد تسليح': { 'طن': 5500.0, # سعر الطن بالريال 'وحدة_قياسية': 'طن', 'آخر_تحديث': datetime(2025, 3, 1) }, 'عزل مائي': { 'م2': 80.0, # سعر المتر المربع بالريال 'وحدة_قياسية': 'م2', 'آخر_تحديث': datetime(2025, 3, 1) }, 'بلوك خرساني': { '20سم': 11.0, # سعر البلكة بالريال 'وحدة_قياسية': 'عدد', 'آخر_تحديث': datetime(2025, 3, 1) }, 'رمل': { 'م3': 140.0, # سعر المتر المكعب بالريال 'وحدة_قياسية': 'م3', 'آخر_تحديث': datetime(2025, 3, 1) }, 'اسمنت': { 'كيس': 25.0, # سعر الكيس بالريال 'وحدة_قياسية': 'كيس', 'آخر_تحديث': datetime(2025, 3, 1) } } return material_prices def _load_labor_rates(self): """تحميل معدلات أجور العمالة""" # محاكاة تحميل البيانات من مصدر بيانات labor_rates = { 'عامل': { 'يومي': 150.0, # الأجر اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'نجار': { 'يومي': 250.0, # الأجر اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'حداد': { 'يومي': 250.0, # الأجر اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'سباك': { 'يومي': 300.0, # الأجر اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'كهربائي': { 'يومي': 300.0, # الأجر اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'مراقب': { 'يومي': 400.0, # الأجر اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) } } return labor_rates def _load_equipment_rates(self): """تحميل معدلات تأجير المعدات""" # محاكاة تحميل البيانات من مصدر بيانات equipment_rates = { 'خلاطة خرسانة': { 'يومي': 800.0, # الإيجار اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'هزاز خرسانة': { 'يومي': 150.0, # الإيجار اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'حفارة': { 'يومي': 1500.0, # الإيجار اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'لودر': { 'يومي': 1200.0, # الإيجار اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'رافعة': { 'يومي': 2000.0, # الإيجار اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) }, 'شاحنة نقل': { 'يومي': 900.0, # الإيجار اليومي بالريال 'وحدة_قياسية': 'يوم', 'آخر_تحديث': datetime(2025, 3, 1) } } return equipment_rates def calculate_prices(self, items_df): """حساب الأسعار للبنود باستخدام التسعير القياسي""" # نسخة من البيانات المدخلة للعمل عليها df = items_df.copy() # التأكد من وجود العمود المطلوب if 'سعر الوحدة' not in df.columns: df['سعر الوحدة'] = 0.0 if 'الإجمالي' not in df.columns: df['الإجمالي'] = 0.0 # حساب أسعار الوحدات لكل بند for idx, row in df.iterrows(): # حساب سعر الوحدة بناءً على وصف البند unit_price = self._estimate_unit_price(row['وصف البند'], row['الوحدة']) df.at[idx, 'سعر الوحدة'] = unit_price # حساب الإجمالي لكل بند df['الإجمالي'] = df['الكمية'] * df['سعر الوحدة'] return df def _estimate_unit_price(self, description, unit): """تقدير سعر الوحدة بناءً على وصف البند ووحدة القياس""" description = description.lower() # تقدير سعر الوحدة بناءً على وصف البند if 'خرسان' in description: if 'أساسات' in description: return 1200.0 if unit == 'م3' else 0.0 elif 'أعمدة' in description: return 1800.0 if unit == 'م3' else 0.0 elif 'سقف' in description: return 1500.0 if unit == 'م3' else 0.0 else: return 1400.0 if unit == 'م3' else 0.0 elif 'حديد' in description and 'تسليح' in description: if 'أساسات' in description: return 6000.0 if unit == 'طن' else 0.0 elif 'أعمدة' in description or 'سقف' in description: return 6500.0 if unit == 'طن' else 0.0 else: return 6200.0 if unit == 'طن' else 0.0 elif 'عزل' in description: if 'مائي' in description: return 120.0 if unit == 'م2' else 0.0 elif 'حراري' in description: return 90.0 if unit == 'م2' else 0.0 else: return 100.0 if unit == 'م2' else 0.0 elif 'ردم' in description or 'حفر' in description: return 75.0 if unit == 'م3' else 0.0 elif 'بلوك' in description or 'طوب' in description: return 250.0 if unit == 'م2' else 0.0 elif 'لياسة' in description or 'بياض' in description: return 80.0 if unit == 'م2' else 0.0 elif 'دهان' in description or 'طلاء' in description: return 65.0 if unit == 'م2' else 0.0 elif 'سيراميك' in description or 'بلاط' in description: return 180.0 if unit == 'م2' else 0.0 elif 'كهرباء' in description: return 150.0 if unit == 'نقطة' else 500.0 # قيمة افتراضية إذا لم تتطابق مع أي وصف return 100.0 def adjust_prices_for_factors(self, items_df, factors=None): """تعديل الأسعار بناءً على عوامل مؤثرة""" # نسخة من البيانات المدخلة للعمل عليها df = items_df.copy() # إذا لم يتم تحديد عوامل، استخدم العوامل الافتراضية if factors is None: factors = { 'location_factor': 1.0, # معامل الموقع 'time_factor': 1.0, # معامل الوقت 'risk_factor': 1.1, # معامل المخاطر 'market_factor': 1.05 # معامل السوق } # حساب المعامل الإجمالي total_factor = (factors['location_factor'] * factors['time_factor'] * factors['risk_factor'] * factors['market_factor']) # تعديل سعر الوحدة بناءً على المعامل الإجمالي df['سعر الوحدة'] = df['سعر الوحدة'] * total_factor # حساب الإجمالي بعد التعديل df['الإجمالي'] = df['الكمية'] * df['سعر الوحدة'] return df