|
"""
|
|
كتالوج العمالة - وحدة إدارة العمالة والمهندسين
|
|
"""
|
|
|
|
import streamlit as st
|
|
import pandas as pd
|
|
import numpy as np
|
|
import plotly.express as px
|
|
import os
|
|
import json
|
|
from datetime import datetime
|
|
import io
|
|
|
|
class LaborCatalog:
|
|
"""كتالوج العمالة"""
|
|
|
|
def __init__(self):
|
|
"""تهيئة كتالوج العمالة"""
|
|
|
|
|
|
if 'labor_catalog' not in st.session_state:
|
|
|
|
self._initialize_labor_catalog()
|
|
|
|
def _initialize_labor_catalog(self):
|
|
"""تهيئة بيانات كتالوج العمالة"""
|
|
|
|
|
|
labor_categories = [
|
|
"مهندسين",
|
|
"فنيين",
|
|
"عمال مهرة",
|
|
"عمال عاديين",
|
|
"سائقين",
|
|
"مشغلي معدات",
|
|
"إداريين"
|
|
]
|
|
|
|
|
|
labor_data = []
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "ENG-001",
|
|
"name": "مهندس مدني (خبرة 15+ سنة)",
|
|
"category": "مهندسين",
|
|
"subcategory": "مدني",
|
|
"hourly_rate": 150,
|
|
"daily_rate": 1200,
|
|
"weekly_rate": 6000,
|
|
"monthly_rate": 25000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إدارة مشاريع، تصميم إنشائي، إشراف على التنفيذ",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين، PMP",
|
|
"description": "مهندس مدني ذو خبرة 15+ سنة في إدارة وتنفيذ مشاريع البنية التحتية والطرق والجسور"
|
|
},
|
|
{
|
|
"id": "ENG-002",
|
|
"name": "مهندس مدني (خبرة 10-15 سنة)",
|
|
"category": "مهندسين",
|
|
"subcategory": "مدني",
|
|
"hourly_rate": 120,
|
|
"daily_rate": 960,
|
|
"weekly_rate": 4800,
|
|
"monthly_rate": 20000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إدارة مشاريع، تصميم إنشائي، إشراف على التنفيذ",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مدني ذو خبرة 10-15 سنة في إدارة وتنفيذ مشاريع البنية التحتية والطرق والجسور"
|
|
},
|
|
{
|
|
"id": "ENG-003",
|
|
"name": "مهندس مدني (خبرة 5-10 سنوات)",
|
|
"category": "مهندسين",
|
|
"subcategory": "مدني",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تصميم إنشائي، إشراف على التنفيذ، حساب كميات",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مدني ذو خبرة 5-10 سنوات في تنفيذ مشاريع البنية التحتية والطرق والجسور"
|
|
},
|
|
{
|
|
"id": "ENG-004",
|
|
"name": "مهندس مدني (خبرة 1-5 سنوات)",
|
|
"category": "مهندسين",
|
|
"subcategory": "مدني",
|
|
"hourly_rate": 80,
|
|
"daily_rate": 640,
|
|
"weekly_rate": 3200,
|
|
"monthly_rate": 13000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إشراف على التنفيذ، حساب كميات، رسم هندسي",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مدني حديث الخبرة في تنفيذ مشاريع البنية التحتية والطرق والجسور"
|
|
},
|
|
{
|
|
"id": "ENG-005",
|
|
"name": "مهندس ميكانيكي (خبرة 10+ سنة)",
|
|
"category": "مهندسين",
|
|
"subcategory": "ميكانيكي",
|
|
"hourly_rate": 130,
|
|
"daily_rate": 1040,
|
|
"weekly_rate": 5200,
|
|
"monthly_rate": 22000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تصميم أنظمة ميكانيكية، إدارة صيانة المعدات، إشراف على التنفيذ",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس ميكانيكي ذو خبرة 10+ سنة في تصميم وتنفيذ الأنظمة الميكانيكية وصيانة المعدات"
|
|
},
|
|
{
|
|
"id": "ENG-006",
|
|
"name": "مهندس ميكانيكي (خبرة 5-10 سنوات)",
|
|
"category": "مهندسين",
|
|
"subcategory": "ميكانيكي",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تصميم أنظمة ميكانيكية، صيانة المعدات، إشراف على التنفيذ",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس ميكانيكي ذو خبرة 5-10 سنوات في تنفيذ الأنظمة الميكانيكية وصيانة المعدات"
|
|
},
|
|
{
|
|
"id": "ENG-007",
|
|
"name": "مهندس كهربائي (خبرة 10+ سنة)",
|
|
"category": "مهندسين",
|
|
"subcategory": "كهربائي",
|
|
"hourly_rate": 130,
|
|
"daily_rate": 1040,
|
|
"weekly_rate": 5200,
|
|
"monthly_rate": 22000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تصميم أنظمة كهربائية، إدارة مشاريع كهربائية، إشراف على التنفيذ",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس كهربائي ذو خبرة 10+ سنة في تصميم وتنفيذ الأنظمة الكهربائية للمشاريع الكبرى"
|
|
},
|
|
{
|
|
"id": "ENG-008",
|
|
"name": "مهندس كهربائي (خبرة 5-10 سنوات)",
|
|
"category": "مهندسين",
|
|
"subcategory": "كهربائي",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تصميم أنظمة كهربائية، إشراف على التنفيذ، اختبار وتشغيل",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس كهربائي ذو خبرة 5-10 سنوات في تنفيذ الأنظمة الكهربائية للمشاريع"
|
|
},
|
|
{
|
|
"id": "ENG-009",
|
|
"name": "مهندس مساحة (خبرة 10+ سنة)",
|
|
"category": "مهندسين",
|
|
"subcategory": "مساحة",
|
|
"hourly_rate": 120,
|
|
"daily_rate": 960,
|
|
"weekly_rate": 4800,
|
|
"monthly_rate": 20000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "مسح طبوغرافي، نظم معلومات جغرافية، حساب كميات",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مساحة ذو خبرة 10+ سنة في المسح الطبوغرافي ونظم المعلومات الجغرافية"
|
|
},
|
|
{
|
|
"id": "ENG-010",
|
|
"name": "مهندس مساحة (خبرة 5-10 سنوات)",
|
|
"category": "مهندسين",
|
|
"subcategory": "مساحة",
|
|
"hourly_rate": 90,
|
|
"daily_rate": 720,
|
|
"weekly_rate": 3600,
|
|
"monthly_rate": 15000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "مسح طبوغرافي، نظم معلومات جغرافية، حساب كميات",
|
|
"certifications": "عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مساحة ذو خبرة 5-10 سنوات في المسح الطبوغرافي ونظم المعلومات الجغرافية"
|
|
}
|
|
])
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "TECH-001",
|
|
"name": "فني مدني (خبرة 10+ سنة)",
|
|
"category": "فنيين",
|
|
"subcategory": "مدني",
|
|
"hourly_rate": 60,
|
|
"daily_rate": 480,
|
|
"weekly_rate": 2400,
|
|
"monthly_rate": 9500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قراءة مخططات، إشراف على التنفيذ، فحص جودة",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني مدني ذو خبرة 10+ سنة في الإشراف على تنفيذ الأعمال المدنية"
|
|
},
|
|
{
|
|
"id": "TECH-002",
|
|
"name": "فني مدني (خبرة 5-10 سنوات)",
|
|
"category": "فنيين",
|
|
"subcategory": "مدني",
|
|
"hourly_rate": 50,
|
|
"daily_rate": 400,
|
|
"weekly_rate": 2000,
|
|
"monthly_rate": 8000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قراءة مخططات، إشراف على التنفيذ، فحص جودة",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني مدني ذو خبرة 5-10 سنوات في الإشراف على تنفيذ الأعمال المدنية"
|
|
},
|
|
{
|
|
"id": "TECH-003",
|
|
"name": "فني مساحة (خبرة 10+ سنة)",
|
|
"category": "فنيين",
|
|
"subcategory": "مساحة",
|
|
"hourly_rate": 55,
|
|
"daily_rate": 440,
|
|
"weekly_rate": 2200,
|
|
"monthly_rate": 9000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "استخدام أجهزة المساحة، قراءة مخططات، حساب كميات",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني مساحة ذو خبرة 10+ سنة في أعمال المساحة وحساب الكميات"
|
|
},
|
|
{
|
|
"id": "TECH-004",
|
|
"name": "فني مساحة (خبرة 5-10 سنوات)",
|
|
"category": "فنيين",
|
|
"subcategory": "مساحة",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "استخدام أجهزة المساحة، قراءة مخططات، حساب كميات",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني مساحة ذو خبرة 5-10 سنوات في أعمال المساحة وحساب الكميات"
|
|
},
|
|
{
|
|
"id": "TECH-005",
|
|
"name": "فني كهربائي (خبرة 10+ سنة)",
|
|
"category": "فنيين",
|
|
"subcategory": "كهربائي",
|
|
"hourly_rate": 55,
|
|
"daily_rate": 440,
|
|
"weekly_rate": 2200,
|
|
"monthly_rate": 9000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تمديدات كهربائية، قراءة مخططات، صيانة",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني كهربائي ذو خبرة 10+ سنة في التمديدات الكهربائية والصيانة"
|
|
},
|
|
{
|
|
"id": "TECH-006",
|
|
"name": "فني كهربائي (خبرة 5-10 سنوات)",
|
|
"category": "فنيين",
|
|
"subcategory": "كهربائي",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تمديدات كهربائية، قراءة مخططات، صيانة",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني كهربائي ذو خبرة 5-10 سنوات في التمديدات الكهربائية والصيانة"
|
|
},
|
|
{
|
|
"id": "TECH-007",
|
|
"name": "فني ميكانيكي (خبرة 10+ سنة)",
|
|
"category": "فنيين",
|
|
"subcategory": "ميكانيكي",
|
|
"hourly_rate": 55,
|
|
"daily_rate": 440,
|
|
"weekly_rate": 2200,
|
|
"monthly_rate": 9000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "صيانة معدات، تركيب أنظمة ميكانيكية، قراءة مخططات",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني ميكانيكي ذو خبرة 10+ سنة في صيانة المعدات وتركيب الأنظمة الميكانيكية"
|
|
},
|
|
{
|
|
"id": "TECH-008",
|
|
"name": "فني ميكانيكي (خبرة 5-10 سنوات)",
|
|
"category": "فنيين",
|
|
"subcategory": "ميكانيكي",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "صيانة معدات، تركيب أنظمة ميكانيكية، قراءة مخططات",
|
|
"certifications": "دبلوم فني",
|
|
"description": "فني ميكانيكي ذو خبرة 5-10 سنوات في صيانة المعدات وتركيب الأنظمة الميكانيكية"
|
|
},
|
|
{
|
|
"id": "TECH-009",
|
|
"name": "فني سباكة (خبرة 10+ سنة)",
|
|
"category": "فنيين",
|
|
"subcategory": "سباكة",
|
|
"hourly_rate": 50,
|
|
"daily_rate": 400,
|
|
"weekly_rate": 2000,
|
|
"monthly_rate": 8000,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تمديدات صحية، تركيب أنظمة صرف، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "فني سباكة ذو خبرة 10+ سنة في التمديدات الصحية وأنظمة الصرف"
|
|
},
|
|
{
|
|
"id": "TECH-010",
|
|
"name": "فني سباكة (خبرة 5-10 سنوات)",
|
|
"category": "فنيين",
|
|
"subcategory": "سباكة",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تمديدات صحية، تركيب أنظمة صرف، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "فني سباكة ذو خبرة 5-10 سنوات في التمديدات الصحية وأنظمة الصرف"
|
|
}
|
|
])
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "SKILL-001",
|
|
"name": "حداد مسلح (خبرة 10+ سنة)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "حداد",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تجهيز وتركيب حديد التسليح، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "حداد مسلح ذو خبرة 10+ سنة في تجهيز وتركيب حديد التسليح للمنشآت الخرسانية"
|
|
},
|
|
{
|
|
"id": "SKILL-002",
|
|
"name": "حداد مسلح (خبرة 5-10 سنوات)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "حداد",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تجهيز وتركيب حديد التسليح، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "حداد مسلح ذو خبرة 5-10 سنوات في تجهيز وتركيب حديد التسليح للمنشآت الخرسانية"
|
|
},
|
|
{
|
|
"id": "SKILL-003",
|
|
"name": "نجار مسلح (خبرة 10+ سنة)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "نجار",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تجهيز وتركيب الشدات الخشبية، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "نجار مسلح ذو خبرة 10+ سنة في تجهيز وتركيب الشدات الخشبية للمنشآت الخرسانية"
|
|
},
|
|
{
|
|
"id": "SKILL-004",
|
|
"name": "نجار مسلح (خبرة 5-10 سنوات)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "نجار",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تجهيز وتركيب الشدات الخشبية، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "نجار مسلح ذو خبرة 5-10 سنوات في تجهيز وتركيب الشدات الخشبية للمنشآت الخرسانية"
|
|
},
|
|
{
|
|
"id": "SKILL-005",
|
|
"name": "بناء (خبرة 10+ سنة)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "بناء",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "بناء طابوق، بناء حجر، تشطيبات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "بناء ذو خبرة 10+ سنة في أعمال البناء بالطابوق والحجر والتشطيبات"
|
|
},
|
|
{
|
|
"id": "SKILL-006",
|
|
"name": "بناء (خبرة 5-10 سنوات)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "بناء",
|
|
"hourly_rate": 30,
|
|
"daily_rate": 240,
|
|
"weekly_rate": 1200,
|
|
"monthly_rate": 4800,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "بناء طابوق، بناء حجر، تشطيبات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "بناء ذو خبرة 5-10 سنوات في أعمال البناء بالطابوق والحجر والتشطيبات"
|
|
},
|
|
{
|
|
"id": "SKILL-007",
|
|
"name": "لحام (خبرة 10+ سنة)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "لحام",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "لحام كهربائي، لحام أرجون، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "لحام ذو خبرة 10+ سنة في أعمال اللحام الكهربائي والأرجون"
|
|
},
|
|
{
|
|
"id": "SKILL-008",
|
|
"name": "لحام (خبرة 5-10 سنوات)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "لحام",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "لحام كهربائي، لحام أرجون، قراءة مخططات",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "لحام ذو خبرة 5-10 سنوات في أعمال اللحام الكهربائي والأرجون"
|
|
},
|
|
{
|
|
"id": "SKILL-009",
|
|
"name": "كهربائي (خبرة 10+ سنة)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "كهربائي",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تمديدات كهربائية، تركيب لوحات، صيانة",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "كهربائي ذو خبرة 10+ سنة في التمديدات الكهربائية وتركيب اللوحات والصيانة"
|
|
},
|
|
{
|
|
"id": "SKILL-010",
|
|
"name": "كهربائي (خبرة 5-10 سنوات)",
|
|
"category": "عمال مهرة",
|
|
"subcategory": "كهربائي",
|
|
"hourly_rate": 30,
|
|
"daily_rate": 240,
|
|
"weekly_rate": 1200,
|
|
"monthly_rate": 4800,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تمديدات كهربائية، تركيب لوحات، صيانة",
|
|
"certifications": "شهادة مهنية",
|
|
"description": "كهربائي ذو خبرة 5-10 سنوات في التمديدات الكهربائية وتركيب اللوحات والصيانة"
|
|
}
|
|
])
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "LABOR-001",
|
|
"name": "عامل عادي (خبرة 5+ سنة)",
|
|
"category": "عمال عاديين",
|
|
"subcategory": "عامل",
|
|
"hourly_rate": 20,
|
|
"daily_rate": 160,
|
|
"weekly_rate": 800,
|
|
"monthly_rate": 3200,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "أعمال يدوية، مناولة مواد، تنظيف",
|
|
"certifications": "لا يوجد",
|
|
"description": "عامل عادي ذو خبرة 5+ سنة في الأعمال اليدوية ومناولة المواد والتنظيف"
|
|
},
|
|
{
|
|
"id": "LABOR-002",
|
|
"name": "عامل عادي (خبرة 1-5 سنوات)",
|
|
"category": "عمال عاديين",
|
|
"subcategory": "عامل",
|
|
"hourly_rate": 15,
|
|
"daily_rate": 120,
|
|
"weekly_rate": 600,
|
|
"monthly_rate": 2400,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "أعمال يدوية، مناولة مواد، تنظيف",
|
|
"certifications": "لا يوجد",
|
|
"description": "عامل عادي ذو خبرة 1-5 سنوات في الأعمال اليدوية ومناولة المواد والتنظيف"
|
|
},
|
|
{
|
|
"id": "LABOR-003",
|
|
"name": "عامل نظافة (خبرة 3+ سنة)",
|
|
"category": "عمال عاديين",
|
|
"subcategory": "نظافة",
|
|
"hourly_rate": 15,
|
|
"daily_rate": 120,
|
|
"weekly_rate": 600,
|
|
"monthly_rate": 2400,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تنظيف، ترتيب، إزالة مخلفات",
|
|
"certifications": "لا يوجد",
|
|
"description": "عامل نظافة ذو خبرة 3+ سنة في أعمال التنظيف والترتيب وإزالة المخلفات"
|
|
},
|
|
{
|
|
"id": "LABOR-004",
|
|
"name": "عامل نظافة (خبرة 1-3 سنوات)",
|
|
"category": "عمال عاديين",
|
|
"subcategory": "نظافة",
|
|
"hourly_rate": 12,
|
|
"daily_rate": 96,
|
|
"weekly_rate": 480,
|
|
"monthly_rate": 1900,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "تنظيف، ترتيب، إزالة مخلفات",
|
|
"certifications": "لا يوجد",
|
|
"description": "عامل نظافة ذو خبرة 1-3 سنوات في أعمال التنظيف والترتيب وإزالة المخلفات"
|
|
},
|
|
{
|
|
"id": "LABOR-005",
|
|
"name": "عامل مساعد (خبرة 3+ سنة)",
|
|
"category": "عمال عاديين",
|
|
"subcategory": "مساعد",
|
|
"hourly_rate": 18,
|
|
"daily_rate": 144,
|
|
"weekly_rate": 720,
|
|
"monthly_rate": 2900,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "مساعدة في أعمال البناء، مناولة مواد، تنظيف",
|
|
"certifications": "لا يوجد",
|
|
"description": "عامل مساعد ذو خبرة 3+ سنة في مساعدة العمال المهرة ومناولة المواد"
|
|
},
|
|
{
|
|
"id": "LABOR-006",
|
|
"name": "عامل مساعد (خبرة 1-3 سنوات)",
|
|
"category": "عمال عاديين",
|
|
"subcategory": "مساعد",
|
|
"hourly_rate": 15,
|
|
"daily_rate": 120,
|
|
"weekly_rate": 600,
|
|
"monthly_rate": 2400,
|
|
"nationality": "مقيم",
|
|
"availability": "متاح",
|
|
"skills": "مساعدة في أعمال البناء، مناولة مواد، تنظيف",
|
|
"certifications": "لا يوجد",
|
|
"description": "عامل مساعد ذو خبرة 1-3 سنوات في مساعدة العمال المهرة ومناولة المواد"
|
|
}
|
|
])
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "DRIVER-001",
|
|
"name": "سائق شاحنة ثقيلة (خبرة 10+ سنة)",
|
|
"category": "سائقين",
|
|
"subcategory": "شاحنة ثقيلة",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قيادة شاحنات ثقيلة، صيانة أولية، سجل نظيف",
|
|
"certifications": "رخصة قيادة شاحنات ثقيلة",
|
|
"description": "سائق شاحنة ثقيلة ذو خبرة 10+ سنة في قيادة الشاحنات الثقيلة ونقل المواد"
|
|
},
|
|
{
|
|
"id": "DRIVER-002",
|
|
"name": "سائق شاحنة ثقيلة (خبرة 5-10 سنوات)",
|
|
"category": "سائقين",
|
|
"subcategory": "شاحنة ثقيلة",
|
|
"hourly_rate": 30,
|
|
"daily_rate": 240,
|
|
"weekly_rate": 1200,
|
|
"monthly_rate": 4800,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قيادة شاحنات ثقيلة، صيانة أولية، سجل نظيف",
|
|
"certifications": "رخصة قيادة شاحنات ثقيلة",
|
|
"description": "سائق شاحنة ثقيلة ذو خبرة 5-10 سنوات في قيادة الشاحنات الثقيلة ونقل المواد"
|
|
},
|
|
{
|
|
"id": "DRIVER-003",
|
|
"name": "سائق شاحنة خلاطة خرسانة (خبرة 10+ سنة)",
|
|
"category": "سائقين",
|
|
"subcategory": "خلاطة خرسانة",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قيادة خلاطات الخرسانة، صيانة أولية، سجل نظيف",
|
|
"certifications": "رخصة قيادة شاحنات ثقيلة",
|
|
"description": "سائق شاحنة خلاطة خرسانة ذو خبرة 10+ سنة في قيادة خلاطات الخرسانة وصب الخرسانة"
|
|
},
|
|
{
|
|
"id": "DRIVER-004",
|
|
"name": "سائق شاحنة خلاطة خرسانة (خبرة 5-10 سنوات)",
|
|
"category": "سائقين",
|
|
"subcategory": "خلاطة خرسانة",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قيادة خلاطات الخرسانة، صيانة أولية، سجل نظيف",
|
|
"certifications": "رخصة قيادة شاحنات ثقيلة",
|
|
"description": "سائق شاحنة خلاطة خرسانة ذو خبرة 5-10 سنوات في قيادة خلاطات الخرسانة وصب الخرسانة"
|
|
},
|
|
{
|
|
"id": "DRIVER-005",
|
|
"name": "سائق شاحنة نقل مياه (خبرة 5+ سنة)",
|
|
"category": "سائقين",
|
|
"subcategory": "نقل مياه",
|
|
"hourly_rate": 30,
|
|
"daily_rate": 240,
|
|
"weekly_rate": 1200,
|
|
"monthly_rate": 4800,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قيادة شاحنات نقل المياه، صيانة أولية، سجل نظيف",
|
|
"certifications": "رخصة قيادة شاحنات ثقيلة",
|
|
"description": "سائق شاحنة نقل مياه ذو خبرة 5+ سنة في قيادة شاحنات نقل المياه وتوزيع المياه"
|
|
},
|
|
{
|
|
"id": "DRIVER-006",
|
|
"name": "سائق سيارة نقل خفيف (خبرة 5+ سنة)",
|
|
"category": "سائقين",
|
|
"subcategory": "نقل خفيف",
|
|
"hourly_rate": 25,
|
|
"daily_rate": 200,
|
|
"weekly_rate": 1000,
|
|
"monthly_rate": 4000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "قيادة سيارات النقل الخفيف، صيانة أولية، سجل نظيف",
|
|
"certifications": "رخصة قيادة",
|
|
"description": "سائق سيارة نقل خفيف ذو خبرة 5+ سنة في قيادة سيارات النقل الخفيف ونقل المواد والعمال"
|
|
}
|
|
])
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "OPER-001",
|
|
"name": "مشغل حفارة (خبرة 10+ سنة)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "حفارة",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل حفارات، صيانة أولية، حفر دقيق",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل حفارة ذو خبرة 10+ سنة في تشغيل الحفارات وأعمال الحفر الدقيق"
|
|
},
|
|
{
|
|
"id": "OPER-002",
|
|
"name": "مشغل حفارة (خبرة 5-10 سنوات)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "حفارة",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل حفارات، صيانة أولية، حفر دقيق",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل حفارة ذو خبرة 5-10 سنوات في تشغيل الحفارات وأعمال الحفر الدقيق"
|
|
},
|
|
{
|
|
"id": "OPER-003",
|
|
"name": "مشغل لودر (خبرة 10+ سنة)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "لودر",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل لودر، صيانة أولية، تحميل دقيق",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل لودر ذو خبرة 10+ سنة في تشغيل اللودر وأعمال التحميل الدقيق"
|
|
},
|
|
{
|
|
"id": "OPER-004",
|
|
"name": "مشغل لودر (خبرة 5-10 سنوات)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "لودر",
|
|
"hourly_rate": 35,
|
|
"daily_rate": 280,
|
|
"weekly_rate": 1400,
|
|
"monthly_rate": 5500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل لودر، صيانة أولية، تحميل دقيق",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل لودر ذو خبرة 5-10 سنوات في تشغيل اللودر وأعمال التحميل الدقيق"
|
|
},
|
|
{
|
|
"id": "OPER-005",
|
|
"name": "مشغل بلدوزر (خبرة 10+ سنة)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "بلدوزر",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل بلدوزر، صيانة أولية، تسوية دقيقة",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل بلدوزر ذو خبرة 10+ سنة في تشغيل البلدوزر وأعمال التسوية الدقيقة"
|
|
},
|
|
{
|
|
"id": "OPER-006",
|
|
"name": "مشغل بلدوزر (خبرة 5-10 سنوات)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "بلدوزر",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل بلدوزر، صيانة أولية، تسوية دقيقة",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل بلدوزر ذو خبرة 5-10 سنوات في تشغيل البلدوزر وأعمال التسوية الدقيقة"
|
|
},
|
|
{
|
|
"id": "OPER-007",
|
|
"name": "مشغل جريدر (خبرة 10+ سنة)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "جريدر",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل جريدر، صيانة أولية، تسوية دقيقة",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل جريدر ذو خبرة 10+ سنة في تشغيل الجريدر وأعمال التسوية الدقيقة للطرق"
|
|
},
|
|
{
|
|
"id": "OPER-008",
|
|
"name": "مشغل جريدر (خبرة 5-10 سنوات)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "جريدر",
|
|
"hourly_rate": 40,
|
|
"daily_rate": 320,
|
|
"weekly_rate": 1600,
|
|
"monthly_rate": 6500,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل جريدر، صيانة أولية، تسوية دقيقة",
|
|
"certifications": "رخصة تشغيل معدات ثقيلة",
|
|
"description": "مشغل جريدر ذو خبرة 5-10 سنوات في تشغيل الجريدر وأعمال التسوية الدقيقة للطرق"
|
|
},
|
|
{
|
|
"id": "OPER-009",
|
|
"name": "مشغل رافعة (خبرة 10+ سنة)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "رافعة",
|
|
"hourly_rate": 50,
|
|
"daily_rate": 400,
|
|
"weekly_rate": 2000,
|
|
"monthly_rate": 8000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل رافعات، صيانة أولية، رفع دقيق",
|
|
"certifications": "رخصة تشغيل رافعات",
|
|
"description": "مشغل رافعة ذو خبرة 10+ سنة في تشغيل الرافعات وأعمال الرفع الدقيق"
|
|
},
|
|
{
|
|
"id": "OPER-010",
|
|
"name": "مشغل رافعة (خبرة 5-10 سنوات)",
|
|
"category": "مشغلي معدات",
|
|
"subcategory": "رافعة",
|
|
"hourly_rate": 45,
|
|
"daily_rate": 360,
|
|
"weekly_rate": 1800,
|
|
"monthly_rate": 7000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تشغيل رافعات، صيانة أولية، رفع دقيق",
|
|
"certifications": "رخصة تشغيل رافعات",
|
|
"description": "مشغل رافعة ذو خبرة 5-10 سنوات في تشغيل الرافعات وأعمال الرفع الدقيق"
|
|
}
|
|
])
|
|
|
|
|
|
labor_data.extend([
|
|
{
|
|
"id": "ADMIN-001",
|
|
"name": "مدير مشروع (خبرة 15+ سنة)",
|
|
"category": "إداريين",
|
|
"subcategory": "مدير مشروع",
|
|
"hourly_rate": 200,
|
|
"daily_rate": 1600,
|
|
"weekly_rate": 8000,
|
|
"monthly_rate": 32000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إدارة مشاريع، تخطيط، متابعة، إعداد تقارير",
|
|
"certifications": "PMP، عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مدير مشروع ذو خبرة 15+ سنة في إدارة مشاريع البنية التحتية والطرق والجسور"
|
|
},
|
|
{
|
|
"id": "ADMIN-002",
|
|
"name": "مدير مشروع (خبرة 10-15 سنة)",
|
|
"category": "إداريين",
|
|
"subcategory": "مدير مشروع",
|
|
"hourly_rate": 150,
|
|
"daily_rate": 1200,
|
|
"weekly_rate": 6000,
|
|
"monthly_rate": 25000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إدارة مشاريع، تخطيط، متابعة، إعداد تقارير",
|
|
"certifications": "PMP، عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مدير مشروع ذو خبرة 10-15 سنة في إدارة مشاريع البنية التحتية والطرق والجسور"
|
|
},
|
|
{
|
|
"id": "ADMIN-003",
|
|
"name": "مهندس تخطيط (خبرة 10+ سنة)",
|
|
"category": "إداريين",
|
|
"subcategory": "تخطيط",
|
|
"hourly_rate": 120,
|
|
"daily_rate": 960,
|
|
"weekly_rate": 4800,
|
|
"monthly_rate": 20000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تخطيط مشاريع، جدولة، متابعة، إعداد تقارير",
|
|
"certifications": "PMP، Primavera P6، MS Project",
|
|
"description": "مهندس تخطيط ذو خبرة 10+ سنة في تخطيط وجدولة ومتابعة مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-004",
|
|
"name": "مهندس تخطيط (خبرة 5-10 سنوات)",
|
|
"category": "إداريين",
|
|
"subcategory": "تخطيط",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "تخطيط مشاريع، جدولة، متابعة، إعداد تقارير",
|
|
"certifications": "Primavera P6، MS Project",
|
|
"description": "مهندس تخطيط ذو خبرة 5-10 سنوات في تخطيط وجدولة ومتابعة مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-005",
|
|
"name": "مهندس مراقبة جودة (خبرة 10+ سنة)",
|
|
"category": "إداريين",
|
|
"subcategory": "مراقبة جودة",
|
|
"hourly_rate": 120,
|
|
"daily_rate": 960,
|
|
"weekly_rate": 4800,
|
|
"monthly_rate": 20000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "مراقبة جودة، اختبارات، إعداد تقارير، تطبيق معايير",
|
|
"certifications": "ISO 9001، عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مراقبة جودة ذو خبرة 10+ سنة في مراقبة جودة مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-006",
|
|
"name": "مهندس مراقبة جودة (خبرة 5-10 سنوات)",
|
|
"category": "إداريين",
|
|
"subcategory": "مراقبة جودة",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "مراقبة جودة، اختبارات، إعداد تقارير، تطبيق معايير",
|
|
"certifications": "ISO 9001، عضوية الهيئة السعودية للمهندسين",
|
|
"description": "مهندس مراقبة جودة ذو خبرة 5-10 سنوات في مراقبة جودة مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-007",
|
|
"name": "مهندس سلامة (خبرة 10+ سنة)",
|
|
"category": "إداريين",
|
|
"subcategory": "سلامة",
|
|
"hourly_rate": 120,
|
|
"daily_rate": 960,
|
|
"weekly_rate": 4800,
|
|
"monthly_rate": 20000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إدارة السلامة، تدريب، تفتيش، إعداد تقارير",
|
|
"certifications": "NEBOSH، OSHA",
|
|
"description": "مهندس سلامة ذو خبرة 10+ سنة في إدارة السلامة في مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-008",
|
|
"name": "مهندس سلامة (خبرة 5-10 سنوات)",
|
|
"category": "إداريين",
|
|
"subcategory": "سلامة",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "إدارة السلامة، تدريب، تفتيش، إعداد تقارير",
|
|
"certifications": "NEBOSH، OSHA",
|
|
"description": "مهندس سلامة ذو خبرة 5-10 سنوات في إدارة السلامة في مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-009",
|
|
"name": "محاسب مشاريع (خبرة 10+ سنة)",
|
|
"category": "إداريين",
|
|
"subcategory": "محاسبة",
|
|
"hourly_rate": 100,
|
|
"daily_rate": 800,
|
|
"weekly_rate": 4000,
|
|
"monthly_rate": 16000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "محاسبة مشاريع، إعداد تقارير مالية، متابعة مصروفات",
|
|
"certifications": "SOCPA",
|
|
"description": "محاسب مشاريع ذو خبرة 10+ سنة في محاسبة مشاريع البنية التحتية"
|
|
},
|
|
{
|
|
"id": "ADMIN-010",
|
|
"name": "محاسب مشاريع (خبرة 5-10 سنوات)",
|
|
"category": "إداريين",
|
|
"subcategory": "محاسبة",
|
|
"hourly_rate": 80,
|
|
"daily_rate": 640,
|
|
"weekly_rate": 3200,
|
|
"monthly_rate": 13000,
|
|
"nationality": "سعودي",
|
|
"availability": "متاح",
|
|
"skills": "محاسبة مشاريع، إعداد تقارير مالية، متابعة مصروفات",
|
|
"certifications": "SOCPA",
|
|
"description": "محاسب مشاريع ذو خبرة 5-10 سنوات في محاسبة مشاريع البنية التحتية"
|
|
}
|
|
])
|
|
|
|
|
|
st.session_state.labor_catalog = pd.DataFrame(labor_data)
|
|
|
|
def render(self):
|
|
"""عرض واجهة كتالوج العمالة"""
|
|
|
|
st.markdown("## كتالوج العمالة والمهندسين")
|
|
|
|
|
|
tabs = st.tabs([
|
|
"عرض الكتالوج",
|
|
"إضافة عامل",
|
|
"تحليل الأسعار",
|
|
"استيراد/تصدير"
|
|
])
|
|
|
|
with tabs[0]:
|
|
self._render_catalog_view_tab()
|
|
|
|
with tabs[1]:
|
|
self._render_add_labor_tab()
|
|
|
|
with tabs[2]:
|
|
self._render_price_analysis_tab()
|
|
|
|
with tabs[3]:
|
|
self._render_import_export_tab()
|
|
|
|
def _render_catalog_view_tab(self):
|
|
"""عرض تبويب عرض الكتالوج"""
|
|
|
|
st.markdown("### عرض كتالوج العمالة والمهندسين")
|
|
|
|
|
|
labor_df = st.session_state.labor_catalog
|
|
|
|
|
|
col1, col2, col3 = st.columns(3)
|
|
|
|
with col1:
|
|
|
|
categories = ["الكل"] + sorted(labor_df["category"].unique().tolist())
|
|
selected_category = st.selectbox("اختر فئة العمالة", categories)
|
|
|
|
with col2:
|
|
|
|
if selected_category != "الكل":
|
|
subcategories = ["الكل"] + sorted(labor_df[labor_df["category"] == selected_category]["subcategory"].unique().tolist())
|
|
else:
|
|
subcategories = ["الكل"] + sorted(labor_df["subcategory"].unique().tolist())
|
|
|
|
selected_subcategory = st.selectbox("اختر التخصص", subcategories)
|
|
|
|
with col3:
|
|
|
|
nationalities = ["الكل"] + sorted(labor_df["nationality"].unique().tolist())
|
|
selected_nationality = st.selectbox("اختر الجنسية", nationalities)
|
|
|
|
|
|
filtered_df = labor_df.copy()
|
|
|
|
if selected_category != "الكل":
|
|
filtered_df = filtered_df[filtered_df["category"] == selected_category]
|
|
|
|
if selected_subcategory != "الكل":
|
|
filtered_df = filtered_df[filtered_df["subcategory"] == selected_subcategory]
|
|
|
|
if selected_nationality != "الكل":
|
|
filtered_df = filtered_df[filtered_df["nationality"] == selected_nationality]
|
|
|
|
|
|
if not filtered_df.empty:
|
|
|
|
st.info(f"تم العثور على {len(filtered_df)} عامل/مهندس")
|
|
|
|
|
|
for i, (_, labor) in enumerate(filtered_df.iterrows()):
|
|
col1, col2 = st.columns([1, 3])
|
|
|
|
with col1:
|
|
|
|
st.image("https://via.placeholder.com/150", caption=labor["name"])
|
|
|
|
with col2:
|
|
|
|
st.markdown(f"**{labor['name']}** (الكود: {labor['id']})")
|
|
st.markdown(f"الفئة: {labor['category']} - {labor['subcategory']}")
|
|
st.markdown(f"الجنسية: {labor['nationality']} | الحالة: {labor['availability']}")
|
|
st.markdown(f"الأسعار: {labor['hourly_rate']} ريال/ساعة | {labor['daily_rate']} ريال/يوم | {labor['monthly_rate']} ريال/شهر")
|
|
st.markdown(f"المهارات: {labor['skills']}")
|
|
|
|
|
|
if st.button(f"عرض التفاصيل الكاملة", key=f"details_{labor['id']}"):
|
|
st.session_state.selected_labor = labor['id']
|
|
self._show_labor_details(labor)
|
|
|
|
st.markdown("---")
|
|
else:
|
|
st.warning("لا توجد عمالة تطابق معايير البحث")
|
|
|
|
def _show_labor_details(self, labor):
|
|
"""عرض تفاصيل العامل"""
|
|
|
|
st.markdown(f"## تفاصيل العامل/المهندس: {labor['name']}")
|
|
|
|
col1, col2 = st.columns([1, 2])
|
|
|
|
with col1:
|
|
|
|
st.image("https://via.placeholder.com/300", caption=labor["name"])
|
|
|
|
with col2:
|
|
|
|
st.markdown("### المعلومات الأساسية")
|
|
st.markdown(f"**الكود:** {labor['id']}")
|
|
st.markdown(f"**الفئة:** {labor['category']} - {labor['subcategory']}")
|
|
st.markdown(f"**الجنسية:** {labor['nationality']}")
|
|
st.markdown(f"**الحالة:** {labor['availability']}")
|
|
st.markdown(f"**المهارات:** {labor['skills']}")
|
|
st.markdown(f"**الشهادات:** {labor['certifications']}")
|
|
st.markdown(f"**الوصف:** {labor['description']}")
|
|
|
|
|
|
st.markdown("### معلومات الأسعار")
|
|
|
|
price_data = {
|
|
"وحدة الزمن": ["ساعة", "يوم", "أسبوع", "شهر"],
|
|
"السعر (ريال)": [
|
|
labor['hourly_rate'],
|
|
labor['daily_rate'],
|
|
labor['weekly_rate'],
|
|
labor['monthly_rate']
|
|
]
|
|
}
|
|
|
|
price_df = pd.DataFrame(price_data)
|
|
st.dataframe(price_df, use_container_width=True)
|
|
|
|
|
|
if st.button("تعديل بيانات العامل"):
|
|
st.session_state.edit_labor = labor['id']
|
|
|
|
|
|
def _render_add_labor_tab(self):
|
|
"""عرض تبويب إضافة عامل"""
|
|
|
|
st.markdown("### إضافة عامل/مهندس جديد")
|
|
|
|
|
|
labor_df = st.session_state.labor_catalog
|
|
|
|
|
|
with st.form("add_labor_form"):
|
|
st.markdown("#### المعلومات الأساسية")
|
|
|
|
|
|
col1, col2 = st.columns(2)
|
|
with col1:
|
|
labor_id = st.text_input("كود العامل", value=f"LABOR-{len(labor_df) + 1:03d}")
|
|
labor_name = st.text_input("اسم العامل", placeholder="مثال: مهندس مدني (خبرة 10+ سنة)")
|
|
|
|
with col2:
|
|
|
|
categories = sorted(labor_df["category"].unique().tolist())
|
|
labor_category = st.selectbox("فئة العامل", categories)
|
|
|
|
|
|
subcategories = sorted(labor_df[labor_df["category"] == labor_category]["subcategory"].unique().tolist())
|
|
labor_subcategory = st.selectbox("التخصص", subcategories)
|
|
|
|
|
|
col1, col2 = st.columns(2)
|
|
with col1:
|
|
labor_nationality = st.selectbox("الجنسية", ["سعودي", "مقيم"])
|
|
with col2:
|
|
labor_availability = st.selectbox("الحالة", ["متاح", "غير متاح"])
|
|
|
|
|
|
st.markdown("#### معلومات الأسعار")
|
|
|
|
col1, col2, col3, col4 = st.columns(4)
|
|
with col1:
|
|
labor_hourly_rate = st.number_input("السعر بالساعة (ريال)", min_value=0, step=5)
|
|
with col2:
|
|
labor_daily_rate = st.number_input("السعر باليوم (ريال)", min_value=0, step=40)
|
|
with col3:
|
|
labor_weekly_rate = st.number_input("السعر بالأسبوع (ريال)", min_value=0, step=200)
|
|
with col4:
|
|
labor_monthly_rate = st.number_input("السعر بالشهر (ريال)", min_value=0, step=1000)
|
|
|
|
|
|
st.markdown("#### المهارات والشهادات")
|
|
|
|
labor_skills = st.text_area("المهارات", placeholder="مثال: إدارة مشاريع، تصميم إنشائي، إشراف على التنفيذ")
|
|
labor_certifications = st.text_input("الشهادات", placeholder="مثال: عضوية الهيئة السعودية للمهندسين، PMP")
|
|
|
|
|
|
labor_description = st.text_area("وصف العامل", placeholder="أدخل وصفاً تفصيلياً للعامل/المهندس")
|
|
|
|
|
|
submit_button = st.form_submit_button("إضافة العامل")
|
|
|
|
if submit_button:
|
|
|
|
if not labor_name or not labor_category or not labor_subcategory:
|
|
st.error("يرجى إدخال المعلومات الأساسية للعامل")
|
|
else:
|
|
|
|
new_labor = {
|
|
"id": labor_id,
|
|
"name": labor_name,
|
|
"category": labor_category,
|
|
"subcategory": labor_subcategory,
|
|
"hourly_rate": labor_hourly_rate,
|
|
"daily_rate": labor_daily_rate,
|
|
"weekly_rate": labor_weekly_rate,
|
|
"monthly_rate": labor_monthly_rate,
|
|
"nationality": labor_nationality,
|
|
"availability": labor_availability,
|
|
"skills": labor_skills,
|
|
"certifications": labor_certifications,
|
|
"description": labor_description
|
|
}
|
|
|
|
|
|
st.session_state.labor_catalog = pd.concat([
|
|
st.session_state.labor_catalog,
|
|
pd.DataFrame([new_labor])
|
|
], ignore_index=True)
|
|
|
|
st.success(f"تمت إضافة العامل {labor_name} بنجاح!")
|
|
|
|
def _render_price_analysis_tab(self):
|
|
"""عرض تبويب تحليل الأسعار"""
|
|
|
|
st.markdown("### تحليل أسعار العمالة والمهندسين")
|
|
|
|
|
|
labor_df = st.session_state.labor_catalog
|
|
|
|
|
|
st.markdown("#### متوسط الأسعار حسب الفئة")
|
|
|
|
|
|
category_prices = labor_df.groupby("category").agg({
|
|
"hourly_rate": "mean",
|
|
"daily_rate": "mean",
|
|
"monthly_rate": "mean"
|
|
}).reset_index()
|
|
|
|
|
|
category_prices.columns = ["الفئة", "متوسط السعر بالساعة", "متوسط السعر باليوم", "متوسط السعر بالشهر"]
|
|
|
|
|
|
st.dataframe(category_prices, use_container_width=True)
|
|
|
|
|
|
st.markdown("#### مقارنة متوسط الأسعار الشهرية حسب الفئة")
|
|
|
|
fig = px.bar(
|
|
category_prices,
|
|
x="الفئة",
|
|
y="متوسط السعر بالشهر",
|
|
title="متوسط أسعار العمالة والمهندسين الشهرية حسب الفئة",
|
|
color="الفئة",
|
|
text_auto=True
|
|
)
|
|
|
|
st.plotly_chart(fig, use_container_width=True)
|
|
|
|
|
|
st.markdown("#### توزيع العمالة حسب الجنسية")
|
|
|
|
|
|
nationality_counts = labor_df["nationality"].value_counts().reset_index()
|
|
nationality_counts.columns = ["الجنسية", "عدد العمالة"]
|
|
|
|
|
|
fig = px.pie(
|
|
nationality_counts,
|
|
values="عدد العمالة",
|
|
names="الجنسية",
|
|
title="توزيع العمالة حسب الجنسية",
|
|
color="الجنسية"
|
|
)
|
|
|
|
st.plotly_chart(fig, use_container_width=True)
|
|
|
|
|
|
st.markdown("#### متوسط الأسعار حسب التخصص")
|
|
|
|
|
|
selected_category_for_analysis = st.selectbox(
|
|
"اختر الفئة للتحليل",
|
|
sorted(labor_df["category"].unique().tolist())
|
|
)
|
|
|
|
|
|
subcategory_prices = labor_df[labor_df["category"] == selected_category_for_analysis].groupby("subcategory").agg({
|
|
"hourly_rate": "mean",
|
|
"daily_rate": "mean",
|
|
"monthly_rate": "mean"
|
|
}).reset_index()
|
|
|
|
|
|
subcategory_prices.columns = ["التخصص", "متوسط السعر بالساعة", "متوسط السعر باليوم", "متوسط السعر بالشهر"]
|
|
|
|
|
|
st.dataframe(subcategory_prices, use_container_width=True)
|
|
|
|
|
|
fig = px.bar(
|
|
subcategory_prices,
|
|
x="التخصص",
|
|
y="متوسط السعر بالشهر",
|
|
title=f"متوسط أسعار {selected_category_for_analysis} الشهرية حسب التخصص",
|
|
color="التخصص",
|
|
text_auto=True
|
|
)
|
|
|
|
st.plotly_chart(fig, use_container_width=True)
|
|
|
|
|
|
st.markdown("#### حاسبة تكاليف العمالة للمشروع")
|
|
|
|
with st.form("project_labor_calculator"):
|
|
st.markdown("أدخل العمالة المطلوبة للمشروع")
|
|
|
|
|
|
selected_labor = st.multiselect(
|
|
"اختر العمالة",
|
|
options=labor_df["name"].tolist(),
|
|
format_func=lambda x: f"{x} ({labor_df[labor_df['name'] == x]['id'].iloc[0]})"
|
|
)
|
|
|
|
|
|
time_unit = st.radio("اختر وحدة الزمن", ["ساعة", "يوم", "أسبوع", "شهر"], horizontal=True)
|
|
|
|
|
|
quantities = {}
|
|
|
|
if selected_labor:
|
|
st.markdown("أدخل المدة المطلوبة")
|
|
|
|
for labor_name in selected_labor:
|
|
quantities[labor_name] = st.number_input(
|
|
f"{labor_name}",
|
|
min_value=0,
|
|
step=1,
|
|
key=f"qty_{labor_df[labor_df['name'] == labor_name]['id'].iloc[0]}"
|
|
)
|
|
|
|
|
|
calculate_button = st.form_submit_button("حساب التكاليف")
|
|
|
|
if calculate_button:
|
|
if not selected_labor:
|
|
st.error("يرجى اختيار عامل واحد على الأقل")
|
|
else:
|
|
|
|
project_costs = []
|
|
|
|
for labor_name in selected_labor:
|
|
labor = labor_df[labor_df["name"] == labor_name].iloc[0]
|
|
quantity = quantities[labor_name]
|
|
|
|
if quantity > 0:
|
|
|
|
if time_unit == "ساعة":
|
|
rate = labor["hourly_rate"]
|
|
rate_name = "السعر بالساعة"
|
|
elif time_unit == "يوم":
|
|
rate = labor["daily_rate"]
|
|
rate_name = "السعر باليوم"
|
|
elif time_unit == "أسبوع":
|
|
rate = labor["weekly_rate"]
|
|
rate_name = "السعر بالأسبوع"
|
|
else:
|
|
rate = labor["monthly_rate"]
|
|
rate_name = "السعر بالشهر"
|
|
|
|
cost = rate * quantity
|
|
|
|
project_costs.append({
|
|
"العامل": labor_name,
|
|
"الكود": labor["id"],
|
|
"الفئة": labor["category"],
|
|
"التخصص": labor["subcategory"],
|
|
rate_name: rate,
|
|
f"عدد {time_unit}ات": quantity,
|
|
"التكلفة الإجمالية": cost
|
|
})
|
|
|
|
if project_costs:
|
|
|
|
project_costs_df = pd.DataFrame(project_costs)
|
|
st.dataframe(project_costs_df, use_container_width=True)
|
|
|
|
|
|
total_cost = project_costs_df["التكلفة الإجمالية"].sum()
|
|
st.metric("إجمالي تكاليف العمالة للمشروع", f"{total_cost:,.2f} ريال")
|
|
else:
|
|
st.warning("يرجى إدخال مدة أكبر من صفر")
|
|
|
|
def _render_import_export_tab(self):
|
|
"""عرض تبويب استيراد/تصدير"""
|
|
|
|
st.markdown("### استيراد وتصدير بيانات العمالة والمهندسين")
|
|
|
|
|
|
st.markdown("#### استيراد البيانات")
|
|
|
|
uploaded_file = st.file_uploader("اختر ملف Excel لاستيراد بيانات العمالة", type=["xlsx", "xls"])
|
|
|
|
if uploaded_file is not None:
|
|
try:
|
|
|
|
imported_df = pd.read_excel(uploaded_file)
|
|
|
|
|
|
st.dataframe(imported_df, use_container_width=True)
|
|
|
|
|
|
if st.button("استيراد البيانات"):
|
|
|
|
required_columns = ["id", "name", "category", "subcategory", "hourly_rate", "daily_rate", "weekly_rate", "monthly_rate"]
|
|
|
|
if all(col in imported_df.columns for col in required_columns):
|
|
|
|
st.session_state.labor_catalog = pd.concat([
|
|
st.session_state.labor_catalog,
|
|
imported_df
|
|
], ignore_index=True).drop_duplicates(subset=["id"])
|
|
|
|
st.success(f"تم استيراد {len(imported_df)} عامل/مهندس بنجاح!")
|
|
else:
|
|
st.error("الملف المستورد لا يحتوي على الأعمدة المطلوبة")
|
|
|
|
except Exception as e:
|
|
st.error(f"حدث خطأ أثناء استيراد الملف: {str(e)}")
|
|
|
|
|
|
st.markdown("#### تصدير البيانات")
|
|
|
|
|
|
export_format = st.radio("اختر تنسيق التصدير", ["Excel", "CSV", "JSON"], horizontal=True)
|
|
|
|
if st.button("تصدير البيانات"):
|
|
|
|
labor_df = st.session_state.labor_catalog
|
|
|
|
|
|
if export_format == "Excel":
|
|
|
|
output = io.BytesIO()
|
|
with pd.ExcelWriter(output, engine="openpyxl") as writer:
|
|
labor_df.to_excel(writer, index=False, sheet_name="Labor")
|
|
|
|
|
|
st.download_button(
|
|
label="تنزيل ملف Excel",
|
|
data=output.getvalue(),
|
|
file_name="labor_catalog.xlsx",
|
|
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
)
|
|
|
|
elif export_format == "CSV":
|
|
|
|
csv_data = labor_df.to_csv(index=False)
|
|
|
|
|
|
st.download_button(
|
|
label="تنزيل ملف CSV",
|
|
data=csv_data,
|
|
file_name="labor_catalog.csv",
|
|
mime="text/csv"
|
|
)
|
|
|
|
else:
|
|
|
|
json_data = labor_df.to_json(orient="records", force_ascii=False)
|
|
|
|
|
|
st.download_button(
|
|
label="تنزيل ملف JSON",
|
|
data=json_data,
|
|
file_name="labor_catalog.json",
|
|
mime="application/json"
|
|
)
|
|
|
|
def get_labor_by_id(self, labor_id):
|
|
"""الحصول على عامل بواسطة الكود"""
|
|
|
|
labor_df = st.session_state.labor_catalog
|
|
labor = labor_df[labor_df["id"] == labor_id]
|
|
|
|
if not labor.empty:
|
|
return labor.iloc[0].to_dict()
|
|
|
|
return None
|
|
|
|
def get_labor_by_category(self, category):
|
|
"""الحصول على العمالة حسب الفئة"""
|
|
|
|
labor_df = st.session_state.labor_catalog
|
|
labor = labor_df[labor_df["category"] == category]
|
|
|
|
if not labor.empty:
|
|
return labor.to_dict(orient="records")
|
|
|
|
return []
|
|
|
|
def calculate_labor_cost(self, labor_id, quantity, time_unit="day"):
|
|
"""حساب تكلفة العامل بناءً على الكمية ووحدة الزمن"""
|
|
|
|
labor = self.get_labor_by_id(labor_id)
|
|
|
|
if labor:
|
|
if time_unit == "hour":
|
|
return labor["hourly_rate"] * quantity
|
|
elif time_unit == "day":
|
|
return labor["daily_rate"] * quantity
|
|
elif time_unit == "week":
|
|
return labor["weekly_rate"] * quantity
|
|
elif time_unit == "month":
|
|
return labor["monthly_rate"] * quantity
|
|
|
|
return 0
|
|
|