import React, { useState } from 'react' import { FaPlus, FaSearch, FaFilter, FaFileAlt, FaClock, FaCheckCircle, FaExclamationTriangle, FaEdit, FaTrash, FaEye, FaDollarSign, } from 'react-icons/fa' import { PmMaintenanceWorkOrder, WorkOrderStatusEnum, WorkOrderTypeEnum } from '../../../types/pm' import { mockMaintenanceWorkOrders } from '../../../mocks/mockMaintenanceWorkOrders' import NewWorkOrderModal from './NewWorkOrderModal' import ViewWorkOrderModal from './ViewWorkOrderModal' import EditWorkOrderModal from './EditWorkOrderModal' import StartWorkOrderModal from './StartWorkOrderModal' import AssignWorkOrdersModal from './AssignWorkOrdersModal' import ChangeWorkOrderStatusModal from './ChangeWorkOrderStatusModal' import Widget from '../../../components/common/Widget' import { getPriorityColor, getPriorityText, getWorkOrderStatusColor, getWorkOrderStatusIcon, getWorkOrderStatusText, getWorkOrderTypeColor, getWorkOrderTypeText, } from '../../../utils/erp' import { Container } from '@/components/shared' const MaintenanceWorkOrders: React.FC = () => { const [searchTerm, setSearchTerm] = useState('') const [statusFilter, setStatusFilter] = useState('all') const [typeFilter, setTypeFilter] = useState('all') const [showModal, setShowModal] = useState(false) const [editingWorkOrder, setEditingWorkOrder] = useState(null) const [viewingWorkOrder, setViewingWorkOrder] = useState(null) const [selectedWorkOrders, setSelectedWorkOrders] = useState([]) const [showStartModal, setShowStartModal] = useState(false) const [showAssignModal, setShowAssignModal] = useState(false) const [showStatusChangeModal, setShowStatusChangeModal] = useState(false) // Mock data - replace with actual API calls const [workOrders, setWorkOrders] = useState(mockMaintenanceWorkOrders) const filteredWorkOrders = workOrders.filter((workOrder) => { const matchesSearch = workOrder.workOrderNumber.toLowerCase().includes(searchTerm.toLowerCase()) || workOrder.description.toLowerCase().includes(searchTerm.toLowerCase()) || workOrder.assignedTo?.toLowerCase().includes(searchTerm.toLowerCase()) || workOrder.reportedBy.toLowerCase().includes(searchTerm.toLowerCase()) const matchesStatus = statusFilter === 'all' || workOrder.status === statusFilter const matchesType = typeFilter === 'all' || workOrder.orderType === typeFilter return matchesSearch && matchesStatus && matchesType }) const getTotalMaterialCost = (workOrder: PmMaintenanceWorkOrder) => { return workOrder.materials.reduce((total, material) => total + material.totalCost, 0) } const getCompletionPercentage = (workOrder: PmMaintenanceWorkOrder) => { const completedActivities = workOrder.activities.filter( (activity) => activity.completedAt, ).length const totalActivities = workOrder.activities.length return totalActivities > 0 ? Math.round((completedActivities / totalActivities) * 100) : 0 } const isOverdue = (workOrder: PmMaintenanceWorkOrder) => { if (!workOrder.scheduledEnd) return false const now = new Date() return workOrder.scheduledEnd < now && workOrder.status !== WorkOrderStatusEnum.Completed } const handleAddWorkOrder = () => { setEditingWorkOrder(null) setShowModal(true) } const handleEdit = (workOrder: PmMaintenanceWorkOrder) => { setEditingWorkOrder(workOrder) setShowModal(true) } const handleView = (workOrder: PmMaintenanceWorkOrder) => { setViewingWorkOrder(workOrder) } const handleSelectWorkOrder = (workOrderId: string) => { setSelectedWorkOrders((prev) => prev.includes(workOrderId) ? prev.filter((id) => id !== workOrderId) : [...prev, workOrderId], ) } const handleSaveWorkOrder = ( workOrderData: Omit, ) => { const newWorkOrder: PmMaintenanceWorkOrder = { ...workOrderData, id: `wo-${Date.now()}`, creationTime: new Date(), lastModificationTime: new Date(), } setWorkOrders([...workOrders, newWorkOrder]) } const handleUpdateWorkOrder = (updatedWorkOrder: PmMaintenanceWorkOrder) => { setWorkOrders(workOrders.map((wo) => (wo.id === updatedWorkOrder.id ? updatedWorkOrder : wo))) } const handleStartWorkOrders = ( selectedWorkOrders: PmMaintenanceWorkOrder[], startData: { actualStart: Date assignedTo?: string maintenanceTeamId?: string notes?: string }, ) => { const updatedWorkOrders = workOrders.map((wo) => { if (selectedWorkOrders.some((swo) => swo.id === wo.id)) { return { ...wo, status: WorkOrderStatusEnum.InProgress, actualStart: startData.actualStart, assignedTo: startData.assignedTo || wo.assignedTo, maintenanceTeamId: startData.maintenanceTeamId || wo.maintenanceTeamId, notes: startData.notes ? `${wo.notes ? wo.notes + '\n' : ''}${startData.notes}` : wo.notes, lastModificationTime: new Date(), } } return wo }) setWorkOrders(updatedWorkOrders) setSelectedWorkOrders([]) } const handleAssignWorkOrders = ( selectedWorkOrders: PmMaintenanceWorkOrder[], assignmentData: { assignmentType: 'person' | 'team' assignedTo?: string maintenanceTeamId?: string notes?: string }, ) => { const updatedWorkOrders = workOrders.map((wo) => { if (selectedWorkOrders.some((swo) => swo.id === wo.id)) { return { ...wo, assignedTo: assignmentData.assignedTo || wo.assignedTo, maintenanceTeamId: assignmentData.maintenanceTeamId || wo.maintenanceTeamId, notes: assignmentData.notes ? `${wo.notes ? wo.notes + '\n' : ''}${assignmentData.notes}` : wo.notes, lastModificationTime: new Date(), } } return wo }) setWorkOrders(updatedWorkOrders) setSelectedWorkOrders([]) } const handleChangeWorkOrderStatus = ( selectedWorkOrders: PmMaintenanceWorkOrder[], statusData: { newStatus: WorkOrderStatusEnum notes?: string completionNotes?: string }, ) => { const updatedWorkOrders = workOrders.map((wo) => { if (selectedWorkOrders.some((swo) => swo.id === wo.id)) { const updates: Partial = { status: statusData.newStatus, lastModificationTime: new Date(), } if (statusData.notes) { updates.notes = statusData.notes } if (statusData.completionNotes) { updates.completionNotes = statusData.completionNotes } if (statusData.newStatus === WorkOrderStatusEnum.Completed) { updates.actualEnd = new Date() } return { ...wo, ...updates } } return wo }) setWorkOrders(updatedWorkOrders) setSelectedWorkOrders([]) } return (
{/* Header */}

Bakım İş Emirleri

Bakım iş emirlerini takip edin ve yönetin

{/* Summary Cards */}
wo.status === WorkOrderStatusEnum.InProgress).length} color="orange" icon="FaWrench" /> wo.status === WorkOrderStatusEnum.Planned).length} color="blue" icon="FaCalendar" /> wo.status === WorkOrderStatusEnum.Completed).length} color="green" icon="FaCheckCircle" /> isOverdue(wo)).length} color="red" icon="FaExclamationTriangle" />
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-9 pr-4 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Work Orders List */}
{filteredWorkOrders.map((workOrder) => { const completionPercentage = getCompletionPercentage(workOrder) const materialCost = getTotalMaterialCost(workOrder) return (
handleSelectWorkOrder(workOrder.id)} className="mt-1 rounded border-gray-300 text-blue-600 focus:ring-blue-500" />

{workOrder.workOrderNumber}

{getWorkOrderStatusIcon(workOrder.status)} {getWorkOrderStatusText(workOrder.status)} {getWorkOrderTypeText(workOrder.orderType)} {getPriorityText(workOrder.priority)} {isOverdue(workOrder) && ( GECİKMİŞ )}

{workOrder.description}

Bildiren:

{workOrder.reportedBy}

Atanan:

{workOrder.assignedTo || 'Atanmadı'}

Planlanan Süre:

{workOrder.scheduledStart && workOrder.scheduledEnd ? ( <> {workOrder.scheduledStart.toLocaleDateString('tr-TR')} -{' '} {workOrder.scheduledEnd.toLocaleDateString('tr-TR')} ) : ( 'Belirsiz' )}

Maliyet:

₺ {workOrder.actualCost > 0 ? workOrder.actualCost.toLocaleString('tr-TR') : workOrder.estimatedCost.toLocaleString('tr-TR')} {workOrder.actualCost === 0 && ( (tahmini) )}

{/* Progress Bar */} {workOrder.status === WorkOrderStatusEnum.InProgress && (
İlerleme {completionPercentage}%
)} {/* Materials Summary */} {workOrder.materials.length > 0 && (
Malzemeler: {workOrder.materials.length} kalem
₺{materialCost.toLocaleString('tr-TR')}
)} {/* Activities Summary */}
Aktiviteler: {workOrder.activities.filter((a) => a.completedAt).length} /{' '} {workOrder.activities.length} tamamlandı
Toplam:{' '} {workOrder.activities.reduce( (total, activity) => total + activity.plannedDuration, 0, )}{' '} dk
{workOrder.notes && (
Notlar:

{workOrder.notes}

)} {workOrder.completionNotes && (
Tamamlanma Notları:

{workOrder.completionNotes}

)}
Oluşturuldu: {workOrder.creationTime.toLocaleDateString('tr-TR')}
Son Güncelleme:{' '} {workOrder.lastModificationTime.toLocaleDateString('tr-TR')}
{workOrder.status === WorkOrderStatusEnum.InProgress && ( )}
) })}
{filteredWorkOrders.length === 0 && (

İş emri bulunamadı

Arama kriterlerinizi değiştirin veya yeni bir iş emri oluşturun.

)} {/* Bulk Actions */} {selectedWorkOrders.length > 0 && (
{selectedWorkOrders.length} iş emri seçildi
)}
{/* Modals */} {showModal && !editingWorkOrder && ( setShowModal(false)} onSave={handleSaveWorkOrder} /> )} {editingWorkOrder && ( { setShowModal(false) setEditingWorkOrder(null) }} onSave={handleUpdateWorkOrder} workOrder={editingWorkOrder} /> )} {viewingWorkOrder && ( setViewingWorkOrder(null)} onEdit={(workOrder) => { setViewingWorkOrder(null) setEditingWorkOrder(workOrder) setShowModal(true) }} workOrder={viewingWorkOrder} /> )} {showStartModal && selectedWorkOrders.length > 0 && ( setShowStartModal(false)} onStart={handleStartWorkOrders} workOrders={workOrders.filter((wo) => selectedWorkOrders.includes(wo.id))} /> )} {showAssignModal && selectedWorkOrders.length > 0 && ( setShowAssignModal(false)} onAssign={handleAssignWorkOrders} workOrders={workOrders.filter((wo) => selectedWorkOrders.includes(wo.id))} /> )} {showStatusChangeModal && selectedWorkOrders.length > 0 && ( setShowStatusChangeModal(false)} onStatusChange={handleChangeWorkOrderStatus} workOrders={workOrders.filter((wo) => selectedWorkOrders.includes(wo.id))} /> )}
) } export default MaintenanceWorkOrders