import React, { useState, useEffect } from "react"; import { FaTimes, FaPlus, FaTrash, FaCalendar, FaClock, FaSave, } from "react-icons/fa"; import { PmMaintenanceWorkOrder, WorkOrderTypeEnum, WorkOrderStatusEnum, PmWorkOrderMaterial, PmWorkOrderActivity, } from "../../../types/pm"; import { mockWorkCenters } from "../../../mocks/mockWorkCenters"; import { mockMaintenanceTeams } from "../../../mocks/mockMaintenanceTeams"; import { mockEmployees } from "../../../mocks/mockEmployees"; import { mockMaterials } from "../../../mocks/mockMaterials"; import { PriorityEnum } from "../../../types/common"; interface EditWorkOrderModalProps { isOpen: boolean; onClose: () => void; onSave: (workOrder: PmMaintenanceWorkOrder) => void; workOrder: PmMaintenanceWorkOrder; } const EditWorkOrderModal: React.FC = ({ isOpen, onClose, onSave, workOrder, }) => { const [formData, setFormData] = useState({ workOrderNumber: "", workCenterId: "", orderType: WorkOrderTypeEnum.Corrective, priority: PriorityEnum.Normal, status: WorkOrderStatusEnum.Created, description: "", reportedBy: "", assignedTo: "", maintenanceTeamId: "", scheduledStart: "", scheduledEnd: "", actualStart: "", actualEnd: "", estimatedCost: 0, actualCost: 0, notes: "", completionNotes: "", }); const [materials, setMaterials] = useState([]); const [activities, setActivities] = useState([]); const [errors, setErrors] = useState>({}); useEffect(() => { if (workOrder && isOpen) { setFormData({ workOrderNumber: workOrder.workOrderNumber, workCenterId: workOrder.workCenterId, orderType: workOrder.orderType, priority: workOrder.priority, status: workOrder.status, description: workOrder.description, reportedBy: workOrder.reportedBy, assignedTo: workOrder.assignedTo || "", maintenanceTeamId: workOrder.maintenanceTeamId || "", scheduledStart: workOrder.scheduledStart ? workOrder.scheduledStart.toISOString().slice(0, 16) : "", scheduledEnd: workOrder.scheduledEnd ? workOrder.scheduledEnd.toISOString().slice(0, 16) : "", actualStart: workOrder.actualStart ? workOrder.actualStart.toISOString().slice(0, 16) : "", actualEnd: workOrder.actualEnd ? workOrder.actualEnd.toISOString().slice(0, 16) : "", estimatedCost: workOrder.estimatedCost, actualCost: workOrder.actualCost, notes: workOrder.notes || "", completionNotes: workOrder.completionNotes || "", }); setMaterials(workOrder.materials); setActivities(workOrder.activities); } }, [workOrder, isOpen]); const validateForm = () => { const newErrors: Record = {}; if (!formData.description.trim()) { newErrors.description = "Açıklama alanı zorunludur"; } if (!formData.workCenterId) { newErrors.workCenterId = "İş merkezi seçimi zorunludur"; } if (!formData.reportedBy.trim()) { newErrors.reportedBy = "Bildiren kişi zorunludur"; } if (formData.estimatedCost < 0) { newErrors.estimatedCost = "Tahmini maliyet negatif olamaz"; } if (formData.actualCost < 0) { newErrors.actualCost = "Gerçek maliyet negatif olamaz"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; const updatedWorkOrder: PmMaintenanceWorkOrder = { ...workOrder, workOrderNumber: formData.workOrderNumber, workCenterId: formData.workCenterId, orderType: formData.orderType, priority: formData.priority, status: formData.status, description: formData.description, reportedBy: formData.reportedBy, assignedTo: formData.assignedTo || undefined, maintenanceTeamId: formData.maintenanceTeamId || undefined, scheduledStart: formData.scheduledStart ? new Date(formData.scheduledStart) : undefined, scheduledEnd: formData.scheduledEnd ? new Date(formData.scheduledEnd) : undefined, actualStart: formData.actualStart ? new Date(formData.actualStart) : undefined, actualEnd: formData.actualEnd ? new Date(formData.actualEnd) : undefined, estimatedCost: formData.estimatedCost, actualCost: formData.actualCost, materials, activities, notes: formData.notes || undefined, completionNotes: formData.completionNotes || undefined, lastModificationTime: new Date(), }; onSave(updatedWorkOrder); onClose(); }; const addMaterial = () => { const newMaterial: PmWorkOrderMaterial = { id: `mat-${Date.now()}`, workOrderId: workOrder.id, materialId: "", materialCode: "", materialName: "", plannedQuantity: 1, actualQuantity: 0, unitCost: 0, totalCost: 0, }; setMaterials([...materials, newMaterial]); }; const removeMaterial = (index: number) => { setMaterials(materials.filter((_, i) => i !== index)); }; const updateMaterial = ( index: number, field: string, value: string | number ) => { const updated = [...materials]; if (field === "materialId") { const selectedMaterial = mockMaterials.find((m) => m.id === value); if (selectedMaterial) { updated[index] = { ...updated[index], materialId: value as string, materialCode: selectedMaterial.code, materialName: selectedMaterial.name, unitCost: selectedMaterial.costPrice, totalCost: updated[index].plannedQuantity * selectedMaterial.costPrice, }; } } else { const material = updated[index]; if (field === "plannedQuantity") { material.plannedQuantity = value as number; material.totalCost = material.plannedQuantity * material.unitCost; } else if (field === "actualQuantity") { material.actualQuantity = value as number; } else if (field === "unitCost") { material.unitCost = value as number; material.totalCost = material.plannedQuantity * material.unitCost; } } setMaterials(updated); }; const addActivity = () => { const newActivity: PmWorkOrderActivity = { id: `act-${Date.now()}`, workOrderId: workOrder.id, activityDescription: "", plannedDuration: 60, actualDuration: 0, performedBy: "", notes: "", }; setActivities([...activities, newActivity]); }; const removeActivity = (index: number) => { setActivities(activities.filter((_, i) => i !== index)); }; const updateActivity = ( index: number, field: string, value: string | number ) => { const updated = [...activities]; const activity = updated[index]; if (field === "activityDescription") { activity.activityDescription = value as string; } else if (field === "plannedDuration") { activity.plannedDuration = value as number; } else if (field === "actualDuration") { activity.actualDuration = value as number; } else if (field === "performedBy") { activity.performedBy = value as string; } else if (field === "notes") { activity.notes = value as string; } setActivities(updated); }; const toggleActivityCompletion = (index: number) => { const updated = [...activities]; const activity = updated[index]; if (activity.completedAt) { activity.completedAt = undefined; } else { activity.completedAt = new Date(); } setActivities(updated); }; if (!isOpen) return null; return (

İş Emrini Düzenle

{/* Basic Information */}
setFormData({ ...formData, workOrderNumber: e.target.value }) } className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" readOnly />
{errors.workCenterId && (

{errors.workCenterId}

)}