EGYADMIN commited on
Commit
b645b79
·
verified ·
1 Parent(s): 2d1b082

Update modules/pricing/pricing_app.py

Browse files
Files changed (1) hide show
  1. modules/pricing/pricing_app.py +116 -123
modules/pricing/pricing_app.py CHANGED
@@ -398,127 +398,120 @@ class PricingApp:
398
 
399
  st.plotly_chart(fig, use_container_width=True)
400
 
401
- def _render_bill_of_quantities_tab(self):
402
- """عرض تبويب جدول الكميات"""
403
-
404
- st.markdown("### جدول الكميات")
405
-
406
- # إنشاء DataFrame من بيانات جدول الكميات
407
- boq_df = pd.DataFrame(st.session_state.bill_of_quantities)
408
-
409
- # عرض جدول الكميات
410
- st.dataframe(
411
- boq_df[['code', 'description', 'unit', 'quantity', 'unit_price', 'total_price', 'category']],
412
- column_config={
413
- 'code': 'الكود',
414
- 'description': 'الوصف',
415
- 'unit': 'الوحدة',
416
- 'quantity': 'الكمية',
417
- 'unit_price': st.column_config.NumberColumn('سعر الوحدة', format='%d ريال'),
418
- 'total_price': st.column_config.NumberColumn('السعر الإجمالي', format='%d ريال'),
419
- 'category': 'الفئة'
420
- },
421
- hide_index=True,
422
- use_container_width=True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
423
  )
424
-
425
- # إضافة بند جديد
426
- st.markdown("### إضافة بند جديد")
427
-
428
- col1, col2 = st.columns(2)
429
-
430
- with col1:
431
- new_code = st.text_input("الكود", key="new_boq_code")
432
- new_description = st.text_input("الوصف", key="new_boq_description")
433
- new_unit = st.selectbox("الوحدة", ["م3", "م2", "طن", "عدد", "متر طولي"], key="new_boq_unit")
434
-
435
- with col2:
436
- new_quantity = st.number_input("الكمية", min_value=0.0, step=1.0, key="new_boq_quantity")
437
- new_unit_price = st.number_input("سعر الوحدة", min_value=0.0, step=10.0, key="new_boq_unit_price")
438
- new_category = st.selectbox(
439
- "الفئة",
440
- [
441
- "أعمال ترابية",
442
- "أعمال خرسانية",
443
- "أعمال حديد",
444
- "أعمال بناء",
445
- "أعمال تشطيبات",
446
- "أعمال نجارة",
447
- "أعمال ألمنيوم",
448
- "أعمال كهربائية",
449
- "أعمال ميكانيكية",
450
- "أعمال صحية"
451
- ],
452
- key="new_boq_category"
453
- )
454
-
455
- if st.button("إضافة البند", key="add_boq_item"):
456
- if new_code and new_description and new_quantity > 0 and new_unit_price > 0:
457
- # حساب السعر الإجمالي
458
- new_total_price = new_quantity * new_unit_price
459
-
460
- # إضافة بند جديد
461
- new_id = max([item['id'] for item in st.session_state.bill_of_quantities]) + 1
462
-
463
- st.session_state.bill_of_quantities.append({
464
- 'id': new_id,
465
- 'code': new_code,
466
- 'description': new_description,
467
- 'unit': new_unit,
468
- 'quantity': new_quantity,
469
- 'unit_price': new_unit_price,
470
- 'total_price': new_total_price,
471
- 'category': new_category
472
- })
473
-
474
- st.success(f"تمت إضافة البند بنجاح: {new_description}")
475
-
476
- # تحديث الصفحة لعرض البند الجديد
477
- st.rerun()
478
- else:
479
- st.error("يرجى إدخال جميع البيانات المطلوبة بشكل صحيح")
480
-
481
- # عرض ملخص جدول الكميات
482
- st.markdown("### ملخص جدول الكميات")
483
-
484
- # عرض ملخص جدول الكميات
485
- st.markdown("### ملخص جدول الكميات")
486
-
487
- # عرض ملخص جدول الكميات
488
- st.markdown("### ملخص جدول الكميات")
489
-
490
- # تجميع البيانات حسب الفئة
491
- category_totals = {}
492
- for item in st.session_state.bill_of_quantities:
493
- category = item['category']
494
- if category in category_totals:
495
- category_totals[category] += item['total_price']
496
- else:
497
- category_totals[category] = item['total_price']
498
-
499
- # إنشاء DataFrame للرسم البياني
500
- category_df = pd.DataFrame({
501
- 'الفئة': list(category_totals.keys()),
502
- 'المبلغ': list(category_totals.values())
503
- })
504
-
505
- # ترتيب البيانات تنازليًا حسب المبلغ
506
- category_df = category_df.sort_values('المبلغ', ascending=False)
507
-
508
- # إنشاء رسم بياني شريطي
509
- fig = px.bar(
510
- category_df,
511
- x='الفئة',
512
- y='المبلغ',
513
- title='إجمالي تكلفة البنود حسب الفئة',
514
- color='الفئة',
515
- text_auto=True
516
- )
517
-
518
- st.plotly_chart(fig, use_container_width=True)
519
-
520
- # حساب إجمالي جدول الكميات
521
- total_boq = sum(item['total_price'] for item in st.session_state.bill_of_quantities)
522
-
523
- st.markdown(f"### إجمالي جدول الكميات: **{total_boq:,.0f} ريال**")
524
- (Content truncated due to size limit. Use line ranges to read in chunks)
 
398
 
399
  st.plotly_chart(fig, use_container_width=True)
400
 
401
+ def _render_bill_of_quantities_tab(self):
402
+ """عرض تبويب جدول الكميات"""
403
+
404
+ st.markdown("### جدول الكميات")
405
+
406
+ # إنشاء DataFrame من بيانات جدول الكميات
407
+ boq_df = pd.DataFrame(st.session_state.bill_of_quantities)
408
+
409
+ # عرض جدول الكميات
410
+ st.dataframe(
411
+ boq_df[['code', 'description', 'unit', 'quantity', 'unit_price', 'total_price', 'category']],
412
+ column_config={
413
+ 'code': 'الكود',
414
+ 'description': 'الوصف',
415
+ 'unit': 'الوحدة',
416
+ 'quantity': 'الكمية',
417
+ 'unit_price': st.column_config.NumberColumn('سعر الوحدة', format='%d ريال'),
418
+ 'total_price': st.column_config.NumberColumn('السعر الإجمالي', format='%d ريال'),
419
+ 'category': 'الفئة'
420
+ },
421
+ hide_index=True,
422
+ use_container_width=True
423
+ )
424
+
425
+ # إضافة بند جديد
426
+ st.markdown("### إضافة بند جديد")
427
+
428
+ col1, col2 = st.columns(2)
429
+
430
+ with col1:
431
+ new_code = st.text_input("الكود", key="new_boq_code")
432
+ new_description = st.text_input("الوصف", key="new_boq_description")
433
+ new_unit = st.selectbox("الوحدة", ["م3", "م2", "طن", "عدد", "متر طولي"], key="new_boq_unit")
434
+
435
+ with col2:
436
+ new_quantity = st.number_input("الكمية", min_value=0.0, step=1.0, key="new_boq_quantity")
437
+ new_unit_price = st.number_input("سعر الوحدة", min_value=0.0, step=10.0, key="new_boq_unit_price")
438
+ new_category = st.selectbox(
439
+ "الفئة",
440
+ [
441
+ "أعمال ترابية",
442
+ "أعمال خرسانية",
443
+ "أعمال حديد",
444
+ "أعمال بناء",
445
+ "أعمال تشطيبات",
446
+ "أعمال نجارة",
447
+ "أعمال ألمنيوم",
448
+ "أعمال كهربائية",
449
+ "أعمال ميكانيكية",
450
+ "أعمال صحية"
451
+ ],
452
+ key="new_boq_category"
453
  )
454
+
455
+ if st.button("إضافة البند", key="add_boq_item"):
456
+ if new_code and new_description and new_quantity > 0 and new_unit_price > 0:
457
+ # حساب السعر الإجمالي
458
+ new_total_price = new_quantity * new_unit_price
459
+
460
+ # إضافة بند جديد
461
+ new_id = max([item['id'] for item in st.session_state.bill_of_quantities]) + 1
462
+
463
+ st.session_state.bill_of_quantities.append({
464
+ 'id': new_id,
465
+ 'code': new_code,
466
+ 'description': new_description,
467
+ 'unit': new_unit,
468
+ 'quantity': new_quantity,
469
+ 'unit_price': new_unit_price,
470
+ 'total_price': new_total_price,
471
+ 'category': new_category
472
+ })
473
+
474
+ st.success(f"تمت إضافة البند بنجاح: {new_description}")
475
+
476
+ # تحديث الصفحة لعرض البند الجديد
477
+ st.rerun()
478
+ else:
479
+ st.error("يرجى إدخال جميع البيانات المطلوبة بشكل صحيح")
480
+
481
+ # عرض ملخص جدول الكميات (إزالة التكرار)
482
+ st.markdown("### ملخص جدول الكميات")
483
+
484
+ # تجميع البيانات حسب الفئة
485
+ category_totals = {}
486
+ for item in st.session_state.bill_of_quantities:
487
+ category = item['category']
488
+ if category in category_totals:
489
+ category_totals[category] += item['total_price']
490
+ else:
491
+ category_totals[category] = item['total_price']
492
+
493
+ # إنشاء DataFrame للرسم البياني
494
+ category_df = pd.DataFrame({
495
+ 'الفئة': list(category_totals.keys()),
496
+ 'المبلغ': list(category_totals.values())
497
+ })
498
+
499
+ # ترتيب البيانات تنازليًا حسب المبلغ
500
+ category_df = category_df.sort_values('المبلغ', ascending=False)
501
+
502
+ # إنشاء رسم بياني شريطي
503
+ fig = px.bar(
504
+ category_df,
505
+ x='الفئة',
506
+ y='المبلغ',
507
+ title='إجمالي تكلفة البنود حسب الفئة',
508
+ color='الفئة',
509
+ text_auto=True
510
+ )
511
+
512
+ st.plotly_chart(fig, use_container_width=True)
513
+
514
+ # حساب إجمالي جدول الكميات
515
+ total_boq = sum(item['total_price'] for item in st.session_state.bill_of_quantities)
516
+
517
+ st.markdown(f"### إجمالي جدول الكميات: **{total_boq:,.0f} ريال**")