Update modules/pricing/pricing_app.py
Browse files- 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 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
423 |
)
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
st.
|
483 |
-
|
484 |
-
#
|
485 |
-
|
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} ريال**")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|