EGYADMIN commited on
Commit
39435b7
·
verified ·
1 Parent(s): 77aa027

Update modules/pricing/pricing_app.py

Browse files
Files changed (1) hide show
  1. modules/pricing/pricing_app.py +165 -43
modules/pricing/pricing_app.py CHANGED
@@ -1105,54 +1105,28 @@ class PricingApp:
1105
  import openai
1106
  import os
1107
 
1108
- # تهيئة عميل OpenAI بطريقة متوافقة مع أحدث الإصدارات والإصدارات القديمة
1109
  api_key = os.environ.get("ai")
1110
- try:
1111
- # للإصدارات الحديثة من المكتبة (1.0.0 وما فوق)
1112
- client = openai.OpenAI(api_key=api_key)
1113
- except TypeError:
1114
- # للإصدارات القديمة من المكتبة (أقل من 1.0.0)
1115
- openai.api_key = api_key
1116
- client = openai
1117
 
1118
  items_df = items.copy()
1119
  prompt = f"""قم بتحليل الجدول التالي للبنود في مشروع إنشاء، وقدم توصية ذكية لتحسين التسعير وضمان التوازن المالي. الجدول يحتوي على البنود، الكميات، الأسعار، والإجماليات:\n\n{items_df.to_string(index=False)}\n\nالتوصية:\n"""
1120
 
1121
  try:
1122
  with st.spinner("جاري توليد التوصية..."):
1123
- try:
1124
- # للإصدارات الحديثة من المكتبة (1.0.0 وما فوق)
1125
- response = client.chat.completions.create(
1126
- model="gpt-4o", # استخدام أحدث نموذج من OpenAI
1127
- messages=[
1128
- {"role": "system", "content": "أنت خبير في تسعير مشاريع البناء والبنية التحتية."},
1129
- {"role": "user", "content": prompt}
1130
- ],
1131
- temperature=0.4,
1132
- max_tokens=500
1133
- )
1134
- except Exception as e:
1135
- if "unexpected keyword argument" in str(e):
1136
- # للإصدارات القديمة من المكتبة (أقل من 1.0.0)
1137
- response = client.ChatCompletion.create(
1138
- model="gpt-4",
1139
- messages=[
1140
- {"role": "system", "content": "أنت خبير في تسعير مشاريع البناء والبنية التحتية."},
1141
- {"role": "user", "content": prompt}
1142
- ],
1143
- temperature=0.4,
1144
- max_tokens=500
1145
- )
1146
- else:
1147
- raise e
1148
 
1149
- # استخراج محتوى الرسالة بطريقة تدعم الإصدارات المختلفة من مكتبة OpenAI
1150
- try:
1151
- # للإصدارات الحديثة من المكتبة (1.0.0 وما فوق)
1152
- recommendation = response.choices[0].message.content
1153
- except AttributeError:
1154
- # للإصدارات القديمة من المكتبة (أقل من 1.0.0)
1155
- recommendation = response.choices[0].text
1156
 
1157
  st.success("تم توليد التوصية بنجاح!")
1158
  st.markdown("#### التوصية الذكية:")
@@ -3325,15 +3299,61 @@ class PricingApp:
3325
  # حساب التكلفة الإجمالية
3326
  st.session_state.local_content_products['التكلفة_الإجمالية'] = st.session_state.local_content_products['الكمية'] * st.session_state.local_content_products['سعر_الوحدة']
3327
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3328
  # عرض جدول البنود مع إمكانية التعديل
 
3329
  edited_products = st.data_editor(
3330
  st.session_state.local_content_products,
3331
  use_container_width=True,
3332
  hide_index=True,
3333
- num_rows="dynamic"
3334
  )
3335
  st.session_state.local_content_products = edited_products
3336
 
 
 
 
 
 
 
 
 
 
 
 
 
3337
  # عرض ملخص المنتجات
3338
  total_products_cost = edited_products['التكلفة_الإجمالية'].sum()
3339
  avg_local_content = (edited_products['التكلفة_الإجمالية'] * edited_products['نسبة_المحتوى_المحلي']).sum() / total_products_cost if total_products_cost > 0 else 0
@@ -3365,15 +3385,52 @@ class PricingApp:
3365
  'نسبة_المحتوى_المحلي': [0.90, 0.85, 0.90, 0.95, 0.95]
3366
  })
3367
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3368
  # عرض جدول الخدمات مع إمكانية التعديل
 
3369
  edited_services = st.data_editor(
3370
  st.session_state.local_content_services,
3371
  use_container_width=True,
3372
  hide_index=True,
3373
- num_rows="dynamic"
3374
  )
3375
  st.session_state.local_content_services = edited_services
3376
 
 
 
 
 
 
 
 
 
 
 
3377
  # عرض ملخص الخدمات
3378
  total_services_cost = edited_services['التكلفة'].sum()
3379
  avg_local_content = (edited_services['التكلفة'] * edited_services['نسبة_المحتوى_المحلي']).sum() / total_services_cost if total_services_cost > 0 else 0
@@ -3410,18 +3467,67 @@ class PricingApp:
3410
  # حساب التكلفة الإجمالية
3411
  st.session_state.local_content_labor['التكلفة_الإجمالية'] = st.session_state.local_content_labor['العدد'] * st.session_state.local_content_labor['الراتب_الشهري'] * st.session_state.local_content_labor['المدة_بالأشهر']
3412
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3413
  # عرض جدول القوى العاملة مع إمكانية التعديل
 
3414
  edited_labor = st.data_editor(
3415
  st.session_state.local_content_labor,
3416
  use_container_width=True,
3417
  hide_index=True,
3418
- num_rows="dynamic"
3419
  )
3420
 
3421
  # إعادة حساب التكلفة الإجمالية بعد التعديل
3422
  edited_labor['التكلفة_الإجمالية'] = edited_labor['العدد'] * edited_labor['الراتب_الشهري'] * edited_labor['المدة_بالأشهر']
3423
  st.session_state.local_content_labor = edited_labor
3424
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3425
  # عرض ملخص القوى العاملة
3426
  total_labor_cost = edited_labor['التكلفة_الإجمالية'].sum()
3427
  avg_local_content = (edited_labor['التكلفة_الإجمالية'] * edited_labor['نسبة_المحتوى_المحلي']).sum() / total_labor_cost if total_labor_cost > 0 else 0
@@ -3685,6 +3791,22 @@ class PricingApp:
3685
  original_cost = result['التكلفة_الإجمالية']
3686
  final_cost = result['السعر_المعدل']['إجمالي']
3687
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3688
  factors = {
3689
  "معامل الموقع": result['عوامل_التعديل']['location_factor'],
3690
  "معامل الوقت": result['عوامل_التعديل']['time_factor'],
 
1105
  import openai
1106
  import os
1107
 
1108
+ # تهيئة عميل OpenAI - استخدام واجهة الإصدار الجديد فقط (1.0.0 وما فوق)
1109
  api_key = os.environ.get("ai")
1110
+ client = openai.OpenAI(api_key=api_key)
 
 
 
 
 
 
1111
 
1112
  items_df = items.copy()
1113
  prompt = f"""قم بتحليل الجدول التالي للبنود في مشروع إنشاء، وقدم توصية ذكية لتحسين التسعير وضمان التوازن المالي. الجدول يحتوي على البنود، الكميات، الأسعار، والإجماليات:\n\n{items_df.to_string(index=False)}\n\nالتوصية:\n"""
1114
 
1115
  try:
1116
  with st.spinner("جاري توليد التوصية..."):
1117
+ # استخدام واجهة OpenAI الجديدة
1118
+ response = client.chat.completions.create(
1119
+ model="gpt-4o", # استخدام أحدث نموذج من OpenAI GPT-4o
1120
+ messages=[
1121
+ {"role": "system", "content": "أنت خبير في تسعير مشاريع البناء والبنية التحتية."},
1122
+ {"role": "user", "content": prompt}
1123
+ ],
1124
+ temperature=0.4,
1125
+ max_tokens=500
1126
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1127
 
1128
+ # استخراج محتوى الرسالة من واجهة OpenAI الجديدة
1129
+ recommendation = response.choices[0].message.content
 
 
 
 
 
1130
 
1131
  st.success("تم توليد التوصية بنجاح!")
1132
  st.markdown("#### التوصية الذكية:")
 
3299
  # حساب التكلفة الإجمالية
3300
  st.session_state.local_content_products['التكلفة_الإجمالية'] = st.session_state.local_content_products['الكمية'] * st.session_state.local_content_products['سعر_الوحدة']
3301
 
3302
+ # نموذج إضافة منتج جديد
3303
+ st.markdown("#### إضافة منتج جديد")
3304
+ col1, col2, col3, col4 = st.columns(4)
3305
+
3306
+ with col1:
3307
+ new_product_name = st.text_input("اسم المنتج", key="new_product_name", value="")
3308
+ with col2:
3309
+ new_product_quantity = st.number_input("الكمية", key="new_product_quantity", min_value=0, value=0)
3310
+ with col3:
3311
+ new_product_price = st.number_input("سعر الوحدة", key="new_product_price", min_value=0, value=0)
3312
+ with col4:
3313
+ new_product_local_content = st.slider("نسبة المحتوى المحلي", key="new_product_local_content", min_value=0.0, max_value=1.0, value=0.8, step=0.01, format="%.2f")
3314
+
3315
+ if st.button("إضافة المنتج"):
3316
+ if new_product_name:
3317
+ # حساب التكلفة الإجمالية
3318
+ total_cost = new_product_quantity * new_product_price
3319
+
3320
+ # إضافة منتج جديد للجدول
3321
+ new_product = pd.DataFrame({
3322
+ 'المنتج': [new_product_name],
3323
+ 'الكمية': [new_product_quantity],
3324
+ 'سعر_الوحدة': [new_product_price],
3325
+ 'التكلفة_الإجمالية': [total_cost],
3326
+ 'نسبة_المحتوى_المحلي': [new_product_local_content]
3327
+ })
3328
+
3329
+ # إضافة المنتج الجديد للجدول الحالي
3330
+ st.session_state.local_content_products = pd.concat([st.session_state.local_content_products, new_product], ignore_index=True)
3331
+ st.success(f"تم إضافة المنتج {new_product_name} بنجاح!")
3332
+ else:
3333
+ st.warning("يرجى إدخال اسم المنتج")
3334
+
3335
  # عرض جدول البنود مع إمكانية التعديل
3336
+ st.markdown("#### جدول المنتجات")
3337
  edited_products = st.data_editor(
3338
  st.session_state.local_content_products,
3339
  use_container_width=True,
3340
  hide_index=True,
3341
+ key="products_editor"
3342
  )
3343
  st.session_state.local_content_products = edited_products
3344
 
3345
+ # زر لحذف المنتجات المحددة
3346
+ if st.button("حذف المنتجات المحددة"):
3347
+ st.session_state.local_content_products = pd.DataFrame({
3348
+ 'المنتج': [],
3349
+ 'الكمية': [],
3350
+ 'سعر_الوحدة': [],
3351
+ 'التكلفة_الإجمالية': [],
3352
+ 'نسبة_المحتوى_المحلي': []
3353
+ })
3354
+ st.success("تم حذف جميع المنتجات!")
3355
+ st.rerun()
3356
+
3357
  # عرض ملخص المنتجات
3358
  total_products_cost = edited_products['التكلفة_الإجمالية'].sum()
3359
  avg_local_content = (edited_products['التكلفة_الإجمالية'] * edited_products['نسبة_المحتوى_المحلي']).sum() / total_products_cost if total_products_cost > 0 else 0
 
3385
  'نسبة_المحتوى_المحلي': [0.90, 0.85, 0.90, 0.95, 0.95]
3386
  })
3387
 
3388
+ # نموذج إضافة خدمة جديدة
3389
+ st.markdown("#### إضافة خدمة جديدة")
3390
+ col1, col2, col3 = st.columns(3)
3391
+
3392
+ with col1:
3393
+ new_service_name = st.text_input("اسم الخدمة", key="new_service_name", value="")
3394
+ with col2:
3395
+ new_service_cost = st.number_input("التكلفة", key="new_service_cost", min_value=0, value=0)
3396
+ with col3:
3397
+ new_service_local_content = st.slider("نسبة المحتوى المحلي", key="new_service_local_content", min_value=0.0, max_value=1.0, value=0.8, step=0.01, format="%.2f")
3398
+
3399
+ if st.button("إضافة الخدمة"):
3400
+ if new_service_name:
3401
+ # إضافة خدمة جديدة للجدول
3402
+ new_service = pd.DataFrame({
3403
+ 'الخدمة': [new_service_name],
3404
+ 'التكلفة': [new_service_cost],
3405
+ 'نسبة_المحتوى_المحلي': [new_service_local_content]
3406
+ })
3407
+
3408
+ # إضافة الخدمة الجديدة للجدول الحالي
3409
+ st.session_state.local_content_services = pd.concat([st.session_state.local_content_services, new_service], ignore_index=True)
3410
+ st.success(f"تم إضافة الخدمة {new_service_name} بنجاح!")
3411
+ else:
3412
+ st.warning("يرجى إدخال اسم الخدمة")
3413
+
3414
  # عرض جدول الخدمات مع إمكانية التعديل
3415
+ st.markdown("#### جدول الخدمات")
3416
  edited_services = st.data_editor(
3417
  st.session_state.local_content_services,
3418
  use_container_width=True,
3419
  hide_index=True,
3420
+ key="services_editor"
3421
  )
3422
  st.session_state.local_content_services = edited_services
3423
 
3424
+ # زر لحذف الخدمات المحددة
3425
+ if st.button("حذف الخدمات المحددة"):
3426
+ st.session_state.local_content_services = pd.DataFrame({
3427
+ 'الخدمة': [],
3428
+ 'التكلفة': [],
3429
+ 'نسبة_المحتوى_المحلي': []
3430
+ })
3431
+ st.success("تم حذف جميع الخدمات!")
3432
+ st.rerun()
3433
+
3434
  # عرض ملخص الخدمات
3435
  total_services_cost = edited_services['التكلفة'].sum()
3436
  avg_local_content = (edited_services['التكلفة'] * edited_services['نسبة_المحتوى_المحلي']).sum() / total_services_cost if total_services_cost > 0 else 0
 
3467
  # حساب التكلفة الإجمالية
3468
  st.session_state.local_content_labor['التكلفة_الإجمالية'] = st.session_state.local_content_labor['العدد'] * st.session_state.local_content_labor['الراتب_الشهري'] * st.session_state.local_content_labor['المدة_بالأشهر']
3469
 
3470
+ # نموذج إضافة فئة عمالة جديدة
3471
+ st.markdown("#### إضافة فئة عمالة جديدة")
3472
+ col1, col2 = st.columns(2)
3473
+
3474
+ with col1:
3475
+ new_labor_category = st.text_input("فئة العمالة", key="new_labor_category", value="")
3476
+ new_labor_count = st.number_input("العدد", key="new_labor_count", min_value=0, value=0)
3477
+
3478
+ with col2:
3479
+ new_labor_salary = st.number_input("الراتب الشهري", key="new_labor_salary", min_value=0, value=0)
3480
+ new_labor_months = st.number_input("المدة بالأشهر", key="new_labor_months", min_value=1, value=12)
3481
+
3482
+ new_labor_local_content = st.slider("نسبة المحتوى المحلي", key="new_labor_local_content", min_value=0.0, max_value=1.0, value=0.8, step=0.01, format="%.2f")
3483
+
3484
+ if st.button("إضافة فئة العمالة"):
3485
+ if new_labor_category:
3486
+ # حساب التكلفة الإجمالية
3487
+ total_cost = new_labor_count * new_labor_salary * new_labor_months
3488
+
3489
+ # إضافة فئة عمالة جديدة للجدول
3490
+ new_labor = pd.DataFrame({
3491
+ 'فئة_العمالة': [new_labor_category],
3492
+ 'العدد': [new_labor_count],
3493
+ 'الراتب_الشهري': [new_labor_salary],
3494
+ 'المدة_بالأشهر': [new_labor_months],
3495
+ 'نسبة_المحتوى_المحلي': [new_labor_local_content],
3496
+ 'التكلفة_الإجمالية': [total_cost]
3497
+ })
3498
+
3499
+ # إضافة فئة العمالة الجديدة للجدول الحالي
3500
+ st.session_state.local_content_labor = pd.concat([st.session_state.local_content_labor, new_labor], ignore_index=True)
3501
+ st.success(f"تم إضافة فئة العمالة {new_labor_category} بنجاح!")
3502
+ else:
3503
+ st.warning("يرجى إدخال اسم فئة العمالة")
3504
+
3505
  # عرض جدول القوى العاملة مع إمكانية التعديل
3506
+ st.markdown("#### جدول القوى العاملة")
3507
  edited_labor = st.data_editor(
3508
  st.session_state.local_content_labor,
3509
  use_container_width=True,
3510
  hide_index=True,
3511
+ key="labor_editor"
3512
  )
3513
 
3514
  # إعادة حساب التكلفة الإجمالية بعد التعديل
3515
  edited_labor['التكلفة_الإجمالية'] = edited_labor['العدد'] * edited_labor['الراتب_الشهري'] * edited_labor['المدة_بالأشهر']
3516
  st.session_state.local_content_labor = edited_labor
3517
 
3518
+ # زر لحذف فئات العمالة المحددة
3519
+ if st.button("حذف فئات العمالة المحددة"):
3520
+ st.session_state.local_content_labor = pd.DataFrame({
3521
+ 'فئة_العمالة': [],
3522
+ 'العدد': [],
3523
+ 'الراتب_الشهري': [],
3524
+ 'المدة_بالأشهر': [],
3525
+ 'نسبة_المحتوى_المحلي': [],
3526
+ 'التكلفة_الإجمالية': []
3527
+ })
3528
+ st.success("تم حذف جميع فئات العمالة!")
3529
+ st.rerun()
3530
+
3531
  # عرض ملخص القوى العاملة
3532
  total_labor_cost = edited_labor['التكلفة_الإجمالية'].sum()
3533
  avg_local_content = (edited_labor['التكلفة_الإجمالية'] * edited_labor['نسبة_المحتوى_المحلي']).sum() / total_labor_cost if total_labor_cost > 0 else 0
 
3791
  original_cost = result['التكلفة_الإجمالية']
3792
  final_cost = result['السعر_المعدل']['إجمالي']
3793
 
3794
+ # التحقق من وجود العوامل، وإضافتها بقيم افتراضية إذا كانت غير موجودة
3795
+ if 'عوامل_التعديل' not in result:
3796
+ result['عوامل_التعديل'] = {}
3797
+
3798
+ # إضافة المفاتيح الناقصة بقيم افتراضية
3799
+ default_factors = {
3800
+ 'location_factor': 1.0,
3801
+ 'time_factor': 1.0,
3802
+ 'risk_factor': 1.0,
3803
+ 'market_factor': 1.0
3804
+ }
3805
+
3806
+ for key, default_value in default_factors.items():
3807
+ if key not in result['عوامل_التعديل']:
3808
+ result['عوامل_التعديل'][key] = default_value
3809
+
3810
  factors = {
3811
  "معامل الموقع": result['عوامل_التعديل']['location_factor'],
3812
  "معامل الوقت": result['عوامل_التعديل']['time_factor'],