import React, { useState } from "react"; import { FaCog, FaPlus, FaEdit, FaTrash, FaClock, FaCheckCircle, FaPlay, } from "react-icons/fa"; import { MrpWorkOrder } from "../../../types/mrp"; import DataTable, { Column } from "../../../components/common/DataTable"; import { mockWorkOrders } from "../../../mocks/mockWorkOrders"; import NewWorkOrderForm from "./NewWorkOrderForm"; import EditWorkOrderForm from "./EditWorkOrderForm"; import ViewWorkOrderModal from "./ViewWorkOrderModal"; import CompleteWorkOrderModal from "./CompleteWorkOrderModal"; import Widget from "../../../components/common/Widget"; import { PriorityEnum } from "../../../types/common"; import { getPriorityColor, getPriorityText, getWorkOrderStatusColor, getWorkOrderStatusText, } from "../../../utils/erp"; import { WorkOrderStatusEnum } from "../../../types/pm"; const WorkOrders: React.FC = () => { const [workOrders, setWorkOrders] = useState(mockWorkOrders); const [searchTerm, setSearchTerm] = useState(""); const [selectedStatus, setSelectedStatus] = useState< WorkOrderStatusEnum | "all" >("all"); const [selectedPriority, setSelectedPriority] = useState< PriorityEnum | "all" >("all"); // Modal states const [isNewWorkOrderOpen, setIsNewWorkOrderOpen] = useState(false); const [isEditWorkOrderOpen, setIsEditWorkOrderOpen] = useState(false); const [isViewWorkOrderOpen, setIsViewWorkOrderOpen] = useState(false); const [isCompleteWorkOrderOpen, setIsCompleteWorkOrderOpen] = useState(false); const [selectedWorkOrder, setSelectedWorkOrder] = useState(null); // Event handlers const handleAdd = () => { setIsNewWorkOrderOpen(true); }; const handleEdit = (workOrder: MrpWorkOrder) => { setSelectedWorkOrder(workOrder); setIsEditWorkOrderOpen(true); }; const handleDelete = (id: string) => { if (window.confirm("Bu iş emrini silmek istediğinizden emin misiniz?")) { setWorkOrders((prev) => prev.filter((wo) => wo.id !== id)); } }; const handleStart = (workOrder: MrpWorkOrder) => { setWorkOrders((prev) => prev.map((wo) => wo.id === workOrder.id ? { ...wo, status: WorkOrderStatusEnum.InProgress, lastModificationTime: new Date(), } : wo ) ); }; const handleComplete = (workOrder: MrpWorkOrder) => { setSelectedWorkOrder(workOrder); setIsCompleteWorkOrderOpen(true); }; const handleViewDetails = (workOrder: MrpWorkOrder) => { setSelectedWorkOrder(workOrder); setIsViewWorkOrderOpen(true); }; // Modal handlers const handleNewWorkOrderSave = ( newWorkOrderData: Omit< MrpWorkOrder, "id" | "creationTime" | "lastModificationTime" > ) => { const newWorkOrder: MrpWorkOrder = { ...newWorkOrderData, id: `WO-${Date.now()}`, creationTime: new Date(), lastModificationTime: new Date(), }; setWorkOrders((prev) => [...prev, newWorkOrder]); }; const handleEditWorkOrderSave = (updatedWorkOrder: MrpWorkOrder) => { setWorkOrders((prev) => prev.map((wo) => (wo.id === updatedWorkOrder.id ? updatedWorkOrder : wo)) ); }; const handleCompleteWorkOrder = ( workOrderId: string, confirmedQuantity: number, scrapQuantity: number ) => { setWorkOrders((prev) => prev.map((wo) => { if (wo.id === workOrderId) { const newConfirmedQuantity = wo.confirmedQuantity + confirmedQuantity; const newScrapQuantity = wo.scrapQuantity + scrapQuantity; const newStatus = newConfirmedQuantity + newScrapQuantity >= wo.plannedQuantity ? WorkOrderStatusEnum.Completed : wo.status; return { ...wo, confirmedQuantity: newConfirmedQuantity, scrapQuantity: newScrapQuantity, status: newStatus, lastModificationTime: new Date(), }; } return wo; }) ); }; const filteredWorkOrders = workOrders.filter((workOrder) => { if ( searchTerm && !workOrder.workOrderNumber .toLowerCase() .includes(searchTerm.toLowerCase()) && !workOrder.productionOrder?.orderNumber ?.toLowerCase() .includes(searchTerm.toLowerCase()) ) { return false; } if (selectedStatus !== "all" && workOrder.status !== selectedStatus) { return false; } if ( selectedPriority !== "all" && workOrder.productionOrder?.priority !== selectedPriority ) { return false; } return true; }); const columns: Column[] = [ { key: "workOrderNumber", header: "İş Emri No", sortable: true, render: (workOrder: MrpWorkOrder) => (
{workOrder.workOrderNumber}
Sıra: {workOrder.sequence}
), }, { key: "productionOrder", header: "Üretim Emri", render: (workOrder: MrpWorkOrder) => (
{workOrder.productionOrder?.orderNumber || "N/A"}
), }, { key: "material", header: "Malzeme", render: (workOrder: MrpWorkOrder) => (
{workOrder.material?.code} {" - "} {workOrder.material?.name || workOrder.materialId}
), }, { key: "workCenter", header: "İş Merkezi", render: (workOrder: MrpWorkOrder) => (
{workOrder.workCenter?.name || workOrder.workCenterId}
{workOrder.operation?.name || workOrder.operationId}
{workOrder.assignedOperators.length} Operatör
), }, { key: "quantities", header: "Miktarlar", render: (workOrder: MrpWorkOrder) => (
Plan: {workOrder.plannedQuantity}
Tamamlanan: {workOrder.confirmedQuantity}
{workOrder.scrapQuantity > 0 && (
Fire: {workOrder.scrapQuantity}
)}
), }, { key: "schedule", header: "Planlama", render: (workOrder: MrpWorkOrder) => (
Başlangıç:{" "} {new Date(workOrder.plannedStartDate).toLocaleDateString("tr-TR")}
Bitiş:{" "} {new Date(workOrder.plannedEndDate).toLocaleDateString("tr-TR")}
), }, { key: "priority", header: "Öncelik", render: (workOrder: MrpWorkOrder) => workOrder.productionOrder?.priority ? ( {getPriorityText(workOrder.productionOrder.priority)} ) : ( "-" ), }, { key: "status", header: "Durum", render: (workOrder: MrpWorkOrder) => ( {getWorkOrderStatusText(workOrder.status)} ), }, { key: "actions", header: "İşlemler", render: (workOrder: MrpWorkOrder) => (
{workOrder.status === WorkOrderStatusEnum.Released && ( )} {workOrder.status === WorkOrderStatusEnum.InProgress && ( )}
), }, ]; // Calculate statistics const totalWorkOrders = workOrders.length; const inProgressOrders = workOrders.filter( (wo) => wo.status === WorkOrderStatusEnum.InProgress ).length; const completedOrders = workOrders.filter( (wo) => wo.status === WorkOrderStatusEnum.Completed ).length; const delayedOrders = workOrders.filter( (wo) => wo.status !== WorkOrderStatusEnum.Completed && new Date(wo.plannedEndDate) < new Date() ).length; // Status distribution const statusDistribution = Object.values(WorkOrderStatusEnum).map( (status) => ({ status, count: workOrders.filter((wo) => wo.status === status).length, percentage: (workOrders.filter((wo) => wo.status === status).length / workOrders.length) * 100 || 0, }) ); return (
{/* Header */}

İş Emirleri

Üretim operasyonlarının detaylı takibi

{/* Stats Cards */}
{/* Status Distribution */}

Durum Dağılımı

{statusDistribution.map(({ status, count, percentage }) => (
{getWorkOrderStatusText(status)}
{count}
{percentage.toFixed(1)}%
))}
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Data Table */}
{filteredWorkOrders.length === 0 && (

İş emri bulunamadı

Arama kriterlerinizi değiştirmeyi deneyin.

)} {/* Modals */} setIsNewWorkOrderOpen(false)} onSave={handleNewWorkOrderSave} /> setIsEditWorkOrderOpen(false)} onSave={handleEditWorkOrderSave} workOrder={selectedWorkOrder} /> setIsViewWorkOrderOpen(false)} workOrder={selectedWorkOrder} /> setIsCompleteWorkOrderOpen(false)} onConfirm={handleCompleteWorkOrder} workOrder={selectedWorkOrder} />
); }; export default WorkOrders;