import React, { useState, useEffect, createContext, useContext } from 'react'; import { initializeApp } from 'firebase/app'; import { getAuth, signInAnonymously, signInWithCustomToken, onAuthStateChanged } from 'firebase/auth'; import { getFirestore, collection, addDoc, getDocs, onSnapshot, doc, updateDoc, deleteDoc, query, where } from 'firebase/firestore'; // Context for Firebase and User data const AppContext = createContext(); // Custom Modal Component (replaces alert/confirm) const CustomModal = ({ isOpen, title, message, onClose, onConfirm, showConfirmButton = false }) => { if (!isOpen) return null; return (

{title}

{message}

{showConfirmButton && ( )}
); }; // Main App Component function App() { const [db, setDb] = useState(null); const [auth, setAuth] = useState(null); const [userId, setUserId] = useState(null); const [isAuthReady, setIsAuthReady] = useState(false); const [currentView, setCurrentView] = useState('dashboard'); // 'dashboard', 'cars', 'dailyCheck', 'emergency', 'monthly', 'annualReport' const [cars, setCars] = useState([]); const [maintenanceRecords, setMaintenanceRecords] = useState([]); const [selectedCar, setSelectedCar] = useState(null); // Modal state const [modal, setModal] = useState({ isOpen: false, title: '', message: '', onClose: () => setModal({ ...modal, isOpen: false }), onConfirm: null, showConfirmButton: false, }); // Initialize Firebase useEffect(() => { try { const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; const firebaseConfig = JSON.parse(typeof __firebase_config !== 'undefined' ? __firebase_config : '{}'); if (Object.keys(firebaseConfig).length === 0) { console.error("Firebase config is missing. Please provide it via __firebase_config."); setModal({ isOpen: true, title: 'خطأ في التهيئة', message: 'لم يتم توفير إعدادات Firebase بشكل صحيح. يرجى التحقق من التكوين.', }); return; } const app = initializeApp(firebaseConfig); const firestore = getFirestore(app); const authInstance = getAuth(app); setDb(firestore); setAuth(authInstance); const unsubscribe = onAuthStateChanged(authInstance, async (user) => { if (user) { setUserId(user.uid); } else { // Sign in anonymously if no user is authenticated and no custom token is available if (typeof __initial_auth_token === 'undefined' || !__initial_auth_token) { await signInAnonymously(authInstance); } } setIsAuthReady(true); }); // Attempt to sign in with custom token if available const initialAuthToken = typeof __initial_auth_token !== 'undefined' ? __initial_auth_token : null; if (authInstance && initialAuthToken) { signInWithCustomToken(authInstance, initialAuthToken) .then(() => console.log("Signed in with custom token")) .catch((error) => { console.error("Error signing in with custom token:", error); // Fallback to anonymous if custom token fails signInAnonymously(authInstance) .then(() => console.log("Signed in anonymously after custom token failure")) .catch(anonError => console.error("Error signing in anonymously:", anonError)); }); } else if (authInstance) { // If no custom token, sign in anonymously signInAnonymously(authInstance) .then(() => console.log("Signed in anonymously")) .catch(anonError => console.error("Error signing in anonymously:", anonError)); } return () => unsubscribe(); } catch (error) { console.error("Failed to initialize Firebase:", error); setModal({ isOpen: true, title: 'خطأ فادح', message: `فشل تهيئة Firebase: ${error.message}. يرجى التحقق من إعداداتك.`, }); } }, []); // Fetch Cars and Maintenance Records useEffect(() => { if (!db || !isAuthReady || !userId) return; const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; // Listen for cars collection (public data) const carsRef = collection(db, `artifacts/${appId}/public/data/cars`); const unsubscribeCars = onSnapshot(carsRef, (snapshot) => { const carsData = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setCars(carsData); }, (error) => { console.error("Error fetching cars:", error); setModal({ isOpen: true, title: 'خطأ في جلب البيانات', message: `فشل جلب بيانات السيارات: ${error.message}`, }); }); // Listen for maintenance records (private data) const maintenanceRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`); const unsubscribeMaintenance = onSnapshot(maintenanceRef, (snapshot) => { const recordsData = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setMaintenanceRecords(recordsData); }, (error) => { console.error("Error fetching maintenance records:", error); setModal({ isOpen: true, title: 'خطأ في جلب البيانات', message: `فشل جلب سجلات الصيانة: ${error.message}`, }); }); return () => { unsubscribeCars(); unsubscribeMaintenance(); }; }, [db, isAuthReady, userId]); const showMessage = (title, message, showConfirm = false, onConfirm = null) => { setModal({ isOpen: true, title, message, onClose: () => setModal({ ...modal, isOpen: false }), onConfirm, showConfirmButton: showConfirm, }); }; if (!isAuthReady) { return (

جاري تحميل التطبيق...

); } return (
{currentView === 'dashboard' && } {currentView === 'cars' && } {currentView === 'dailyCheck' && } {currentView === 'emergency' && } {currentView === 'monthly' && } {currentView === 'annualReport' && }
); } // Navigation Item Component const NavItem = ({ children, onClick, isActive }) => ( ); // Dashboard Component const Dashboard = () => { const { cars, maintenanceRecords } = useContext(AppContext); // Calculate upcoming maintenance (example: next 30 days for monthly/quarterly/annual) const upcomingMaintenance = maintenanceRecords.filter(record => { const nextDate = record.nextMaintenanceDate ? new Date(record.nextMaintenanceDate) : null; if (!nextDate) return false; const today = new Date(); const thirtyDaysLater = new Date(); thirtyDaysLater.setDate(today.getDate() + 30); return nextDate >= today && nextDate <= thirtyDaysLater; }).sort((a, b) => new Date(a.nextMaintenanceDate) - new Date(b.nextMaintenanceDate)); // Calculate open emergency requests const openEmergencyRequests = maintenanceRecords.filter(record => record.type === 'emergency' && record.status !== 'تم الإصلاح' ); return (

الصيانة القادمة

{upcomingMaintenance.length > 0 ? (
    {upcomingMaintenance.map(record => (
  • السيارة: {record.carNumber}

    النوع: {record.type}

    الموعد: {new Date(record.nextMaintenanceDate).toLocaleDateString('ar-SA')}

    قريبًا
  • ))}
) : (

لا توجد صيانة قادمة خلال 30 يومًا.

)}

طلبات الإصلاح المفتوحة

{openEmergencyRequests.length > 0 ? (
    {openEmergencyRequests.map(record => (
  • السيارة: {record.carNumber}

    العطل: {record.description}

    الحالة: {record.status}

  • ))}
) : (

لا توجد طلبات إصلاح مفتوحة حاليًا.

)}
); }; // Dashboard Card Component const DashboardCard = ({ title, value, icon }) => (

{title}

{value}

{icon}
); // Car Management Component const CarManagement = () => { const { cars, showMessage, db, setCars } = useContext(AppContext); const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; const [isAddingCar, setIsAddingCar] = useState(false); const [newCarData, setNewCarData] = useState({ carNumber: '', model: '', year: '', fuelType: '', plateNumber: '', owner: '', currentMileage: 0 }); const [editingCar, setEditingCar] = useState(null); // State to hold car being edited const handleInputChange = (e) => { const { name, value } = e.target; setNewCarData(prev => ({ ...prev, [name]: value })); }; const handleAddCar = async (e) => { e.preventDefault(); if (!db) { showMessage('خطأ', 'قاعدة البيانات غير مهيأة.'); return; } if (!newCarData.carNumber || !newCarData.model || !newCarData.plateNumber) { showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، الموديل، رقم اللوحة).'); return; } try { const carsCollectionRef = collection(db, `artifacts/${appId}/public/data/cars`); await addDoc(carsCollectionRef, newCarData); showMessage('نجاح', 'تمت إضافة السيارة بنجاح!'); setNewCarData({ carNumber: '', model: '', year: '', fuelType: '', plateNumber: '', owner: '', currentMileage: 0 }); setIsAddingCar(false); } catch (error) { console.error("Error adding car:", error); showMessage('خطأ', `فشل إضافة السيارة: ${error.message}`); } }; const handleEditCar = (car) => { setEditingCar(car); setNewCarData(car); // Populate form with existing car data setIsAddingCar(true); // Show the form for editing }; const handleUpdateCar = async (e) => { e.preventDefault(); if (!db || !editingCar) { showMessage('خطأ', 'قاعدة البيانات غير مهيأة أو لا توجد سيارة للتحديث.'); return; } try { const carDocRef = doc(db, `artifacts/${appId}/public/data/cars`, editingCar.id); await updateDoc(carDocRef, newCarData); showMessage('نجاح', 'تم تحديث بيانات السيارة بنجاح!'); setEditingCar(null); setNewCarData({ carNumber: '', model: '', year: '', fuelType: '', plateNumber: '', owner: '', currentMileage: 0 }); setIsAddingCar(false); } catch (error) { console.error("Error updating car:", error); showMessage('خطأ', `فشل تحديث السيارة: ${error.message}`); } }; const handleDeleteCar = (carId) => { showMessage( 'تأكيد الحذف', 'هل أنت متأكد أنك تريد حذف هذه السيارة؟ سيتم حذف جميع سجلات الصيانة المتعلقة بها أيضًا.', true, async () => { try { // Delete car document const carDocRef = doc(db, `artifacts/${appId}/public/data/cars`, carId); await deleteDoc(carDocRef); // Optional: Delete related maintenance records (more complex query needed for private data) // For simplicity, this example only deletes the car. // In a real app, you'd query and delete all maintenance records linked to this carId. showMessage('نجاح', 'تم حذف السيارة بنجاح!'); setCars(prev => prev.filter(car => car.id !== carId)); // Update local state } catch (error) { console.error("Error deleting car:", error); showMessage('خطأ', `فشل حذف السيارة: ${error.message}`); } } ); }; return (

إدارة السيارات

{isAddingCar && (

{editingCar ? 'تعديل بيانات السيارة' : 'إضافة سيارة جديدة'}

)}

قائمة السيارات المسجلة

{cars.length === 0 ? (

لا توجد سيارات مسجلة بعد. ابدأ بإضافة سيارة جديدة!

) : (
{cars.map(car => ( ))}
رقم السيارة الموديل رقم اللوحة عداد المسافات الإجراءات
{car.carNumber} {car.model} {car.plateNumber} {car.currentMileage || 'غير محدد'} كم
)}
); }; // Form Input Field Component const InputField = ({ label, name, value, onChange, type = 'text', required = false }) => (
); // Form Select Field Component const SelectField = ({ label, name, value, onChange, options, required = false }) => (
); // Daily Check Form Component const DailyCheckForm = () => { const { db, userId, cars, showMessage } = useContext(AppContext); const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; const [formData, setFormData] = useState({ carId: '', carNumber: '', // To store car number for easier display/query date: new Date().toISOString().split('T')[0], oilCheck: false, tirePressure: '', lightsCheck: false, brakesCheck: false, coolingFluidsCheck: false, cleanlinessCheck: false, notes: '', driverSignature: '', }); const handleCarSelect = (e) => { const selectedCarId = e.target.value; const car = cars.find(c => c.id === selectedCarId); setFormData(prev => ({ ...prev, carId: selectedCarId, carNumber: car ? car.carNumber : '', })); }; const handleInputChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value, })); }; const handleSubmit = async (e) => { e.preventDefault(); if (!db || !userId) { showMessage('خطأ', 'قاعدة البيانات أو معرف المستخدم غير متاح.'); return; } if (!formData.carId || !formData.date || !formData.driverSignature) { showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، التاريخ، توقيع السائق).'); return; } try { const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`); await addDoc(maintenanceCollectionRef, { ...formData, type: 'صيانة يومية', timestamp: new Date(), }); showMessage('نجاح', 'تم تسجيل الفحص اليومي بنجاح!'); setFormData({ carId: '', carNumber: '', date: new Date().toISOString().split('T')[0], oilCheck: false, tirePressure: '', lightsCheck: false, brakesCheck: false, coolingFluidsCheck: false, cleanlinessCheck: false, notes: '', driverSignature: '', }); } catch (error) { console.error("Error adding daily check:", error); showMessage('خطأ', `فشل تسجيل الفحص اليومي: ${error.message}`); } }; return (

نموذج الفحص اليومي للسيارة

({ value: car.id, label: car.carNumber }))} required />
); }; // Checkbox Field Component const CheckboxField = ({ label, name, checked, onChange }) => (
); // Emergency Request Form Component const EmergencyRequestForm = () => { const { db, userId, cars, showMessage } = useContext(AppContext); const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; const [formData, setFormData] = useState({ carId: '', carNumber: '', date: new Date().toISOString().split('T')[0], description: '', priority: 'متوسط', // 'عاجل', 'متوسط', 'منخفض' status: 'قيد الانتظار', // 'قيد الانتظار', 'قيد الإصلاح', 'تم الإصلاح', 'بانتظار قطع الغيار' estimatedCost: 0, actualCost: 0, signature: '', }); const [editingRequest, setEditingRequest] = useState(null); const handleCarSelect = (e) => { const selectedCarId = e.target.value; const car = cars.find(c => c.id === selectedCarId); setFormData(prev => ({ ...prev, carId: selectedCarId, carNumber: car ? car.carNumber : '', })); }; const handleInputChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleSubmit = async (e) => { e.preventDefault(); if (!db || !userId) { showMessage('خطأ', 'قاعدة البيانات أو معرف المستخدم غير متاح.'); return; } if (!formData.carId || !formData.description || !formData.signature) { showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، وصف العطل، التوقيع).'); return; } try { const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`); if (editingRequest) { const docRef = doc(maintenanceCollectionRef, editingRequest.id); await updateDoc(docRef, { ...formData, timestamp: new Date() }); showMessage('نجاح', 'تم تحديث طلب الإصلاح بنجاح!'); setEditingRequest(null); } else { await addDoc(maintenanceCollectionRef, { ...formData, type: 'صيانة طارئة', timestamp: new Date(), }); showMessage('نجاح', 'تم تسجيل طلب الإصلاح الطارئ بنجاح!'); } setFormData({ carId: '', carNumber: '', date: new Date().toISOString().split('T')[0], description: '', priority: 'متوسط', status: 'قيد الانتظار', estimatedCost: 0, actualCost: 0, signature: '' }); } catch (error) { console.error("Error submitting emergency request:", error); showMessage('خطأ', `فشل تسجيل طلب الإصلاح الطارئ: ${error.message}`); } }; const handleEditRequest = (request) => { setEditingRequest(request); setFormData(request); }; const handleDeleteRequest = (requestId) => { showMessage( 'تأكيد الحذف', 'هل أنت متأكد أنك تريد حذف طلب الإصلاح هذا؟', true, async () => { try { const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`); const docRef = doc(maintenanceCollectionRef, requestId); await deleteDoc(docRef); showMessage('نجاح', 'تم حذف طلب الإصلاح بنجاح!'); } catch (error) { console.error("Error deleting emergency request:", error); showMessage('خطأ', `فشل حذف طلب الإصلاح: ${error.message}`); } } ); }; const emergencyRequests = useContext(AppContext).maintenanceRecords.filter(rec => rec.type === 'صيانة طارئة'); return (

نموذج طلب إصلاح طارئ

({ value: car.id, label: car.carNumber }))} required /> {editingRequest && ( )}

طلبات الإصلاح الطارئة المسجلة

{emergencyRequests.length === 0 ? (

لا توجد طلبات إصلاح طارئة مسجلة.

) : (
{emergencyRequests.map(req => ( ))}
رقم السيارة التاريخ وصف العطل الأولوية الحالة التكلفة المتوقعة التكلفة الفعلية الإجراءات
{req.carNumber} {new Date(req.date).toLocaleDateString('ar-SA')} {req.description} {req.priority} {req.status} {req.estimatedCost} ريال {req.actualCost} ريال
)}
); }; // Monthly Maintenance Form Component const MonthlyMaintenanceForm = () => { const { db, userId, cars, showMessage } = useContext(AppContext); const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; const [formData, setFormData] = useState({ carId: '', carNumber: '', lastMaintenanceDate: new Date().toISOString().split('T')[0], maintenanceType: '', // 'شهرية', 'ربع سنوية', 'سنوية' mileage: 0, tasksCompleted: '', // Comma separated string or array nextMaintenanceDate: '', notes: '', }); const [editingRecord, setEditingRecord] = useState(null); const handleCarSelect = (e) => { const selectedCarId = e.target.value; const car = cars.find(c => c.id === selectedCarId); setFormData(prev => ({ ...prev, carId: selectedCarId, carNumber: car ? car.carNumber : '', })); }; const handleInputChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const calculateNextMaintenanceDate = (type, lastDate, mileage) => { const d = new Date(lastDate); switch (type) { case 'شهرية': d.setMonth(d.getMonth() + 1); return d.toISOString().split('T')[0]; case 'ربع سنوية': d.setMonth(d.getMonth() + 3); return d.toISOString().split('T')[0]; case 'سنوية': d.setFullYear(d.getFullYear() + 1); return d.toISOString().split('T')[0]; default: return ''; } }; useEffect(() => { if (formData.lastMaintenanceDate && formData.maintenanceType) { const nextDate = calculateNextMaintenanceDate(formData.maintenanceType, formData.lastMaintenanceDate, formData.mileage); setFormData(prev => ({ ...prev, nextMaintenanceDate: nextDate })); } }, [formData.lastMaintenanceDate, formData.maintenanceType, formData.mileage]); const handleSubmit = async (e) => { e.preventDefault(); if (!db || !userId) { showMessage('خطأ', 'قاعدة البيانات أو معرف المستخدم غير متاح.'); return; } if (!formData.carId || !formData.lastMaintenanceDate || !formData.maintenanceType || !formData.mileage) { showMessage('خطأ', 'الرجاء ملء الحقول المطلوبة (رقم السيارة، تاريخ آخر صيانة، نوع الصيانة، المسافة المقطوعة).'); return; } try { const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`); if (editingRecord) { const docRef = doc(maintenanceCollectionRef, editingRecord.id); await updateDoc(docRef, { ...formData, timestamp: new Date() }); showMessage('نجاح', 'تم تحديث سجل الصيانة الدورية بنجاح!'); setEditingRecord(null); } else { await addDoc(maintenanceCollectionRef, { ...formData, type: formData.maintenanceType, // Use the selected type timestamp: new Date(), }); showMessage('نجاح', 'تم تسجيل الصيانة الدورية بنجاح!'); } setFormData({ carId: '', carNumber: '', lastMaintenanceDate: new Date().toISOString().split('T')[0], maintenanceType: '', mileage: 0, tasksCompleted: '', nextMaintenanceDate: '', notes: '' }); } catch (error) { console.error("Error submitting monthly maintenance:", error); showMessage('خطأ', `فشل تسجيل الصيانة الدورية: ${error.message}`); } }; const handleEditRecord = (record) => { setEditingRecord(record); setFormData(record); }; const handleDeleteRecord = (recordId) => { showMessage( 'تأكيد الحذف', 'هل أنت متأكد أنك تريد حذف سجل الصيانة هذا؟', true, async () => { try { const maintenanceCollectionRef = collection(db, `artifacts/${appId}/users/${userId}/maintenanceRecords`); const docRef = doc(maintenanceCollectionRef, recordId); await deleteDoc(docRef); showMessage('نجاح', 'تم حذف سجل الصيانة بنجاح!'); } catch (error) { console.error("Error deleting maintenance record:", error); showMessage('خطأ', `فشل حذف سجل الصيانة: ${error.message}`); } } ); }; const periodicMaintenanceRecords = useContext(AppContext).maintenanceRecords.filter(rec => ['شهرية', 'ربع سنوية', 'سنوية'].includes(rec.type) ); return (

جدول الصيانة الدورية

({ value: car.id, label: car.carNumber }))} required /> {editingRecord && ( )}

سجلات الصيانة الدورية

{periodicMaintenanceRecords.length === 0 ? (

لا توجد سجلات صيانة دورية مسجلة.

) : (
{periodicMaintenanceRecords.map(rec => ( ))}
رقم السيارة نوع الصيانة تاريخ آخر صيانة المسافة (كم) المهام المنجزة الموعد القادم الإجراءات
{rec.carNumber} {rec.maintenanceType} {new Date(rec.lastMaintenanceDate).toLocaleDateString('ar-SA')} {rec.mileage} {rec.tasksCompleted} {new Date(rec.nextMaintenanceDate).toLocaleDateString('ar-SA')}
)}
); }; // Annual Report Component const AnnualReport = () => { const { cars, maintenanceRecords, showMessage } = useContext(AppContext); const [selectedCarId, setSelectedCarId] = useState(''); const [selectedYear, setSelectedYear] = useState(new Date().getFullYear()); const [reportData, setReportData] = useState(null); const generateReport = () => { if (!selectedCarId || !selectedYear) { showMessage('خطأ', 'الرجاء اختيار السيارة والسنة لإنشاء التقرير.'); return; } const car = cars.find(c => c.id === selectedCarId); if (!car) { showMessage('خطأ', 'السيارة المختارة غير موجودة.'); return; } const yearRecords = maintenanceRecords.filter(record => { const recordDate = new Date(record.date || record.lastMaintenanceDate || record.timestamp.toDate()); return record.carId === selectedCarId && recordDate.getFullYear() === selectedYear; }); let totalAnnualMileage = 0; let totalCost = 0; const maintenanceCount = { 'صيانة يومية': 0, 'صيانة أسبوعية': 0, 'شهرية': 0, 'ربع سنوية': 0, 'سنوية': 0, 'صيانة طارئة': 0, }; const recurringFaults = {}; // { description: count } yearRecords.forEach(record => { if (record.mileage) { totalAnnualMileage += parseInt(record.mileage, 10); } if (record.actualCost) { totalCost += parseFloat(record.actualCost); } else if (record.estimatedCost && record.status === 'تم الإصلاح') { totalCost += parseFloat(record.estimatedCost); } if (maintenanceCount[record.type]) { maintenanceCount[record.type]++; } else { maintenanceCount[record.type] = 1; } if (record.type === 'صيانة طارئة' && record.description) { recurringFaults[record.description] = (recurringFaults[record.description] || 0) + 1; } }); const sortedRecurringFaults = Object.entries(recurringFaults) .filter(([, count]) => count > 1) // Only show faults that occurred more than once .sort((a, b) => b[1] - a[1]) .map(([desc, count]) => `${desc} (${count} مرات)`); setReportData({ carNumber: car.carNumber, annualMileage: totalAnnualMileage, totalMaintenanceCount: yearRecords.length, maintenanceBreakdown: maintenanceCount, totalCosts: totalCost, recurringFaults: sortedRecurringFaults.length > 0 ? sortedRecurringFaults.join(', ') : 'لا توجد أعطال متكررة', carConditionRating: 'جيدة (⭐️⭐️⭐️⭐️)' // This would ideally be a manual input or calculated based on severity of faults }); }; const handlePrint = () => { const printContent = document.getElementById('annual-report-content').innerHTML; const originalContent = document.body.innerHTML; document.body.innerHTML = printContent; window.print(); document.body.innerHTML = originalContent; window.location.reload(); // Reload to restore original page }; const handleShare = () => { // In a real application, this would generate a unique, read-only link to the report. // For this example, we'll just provide the current URL as a placeholder. const reportUrl = window.location.href; // This is the app URL, not a specific report URL navigator.clipboard.writeText(reportUrl) .then(() => showMessage('نجاح', 'تم نسخ رابط التطبيق إلى الحافظة. يمكنك مشاركته مع الآخرين لعرض التقارير (إذا كان لديهم صلاحية الوصول).')) .catch(() => showMessage('خطأ', 'فشل نسخ الرابط إلى الحافظة. يرجى النسخ يدويًا.')); }; return (

تقرير صيانة سنوي

setSelectedCarId(e.target.value)} options={cars.map(car => ({ value: car.id, label: car.carNumber }))} required /> setSelectedYear(parseInt(e.target.value))} options={Array.from({ length: 5 }, (_, i) => new Date().getFullYear() - i)} // Last 5 years required />
{reportData && (

تقرير الصيانة السنوي لـ {reportData.carNumber} - سنة {selectedYear}

رقم السيارة: {reportData.carNumber}

المسافة السنوية: {reportData.annualMileage} كم

عدد مرات الصيانة: {reportData.totalMaintenanceCount}

التكاليف الإجمالية: {reportData.totalCosts} ريال

الأعطال المتكررة: {reportData.recurringFaults}

تقييم حالة السيارة: {reportData.carConditionRating}

تفصيل أنواع الصيانة:

    {Object.entries(reportData.maintenanceBreakdown).map(([type, count]) => (
  • {type}: {count} مرات
  • ))}
)}
); }; export default App; �