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"; 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< PmMaintenanceWorkOrder, "id" | "creationTime" | "lastModificationTime" > ) => { 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;