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' import { Container } from '@/components/shared' const WorkOrders: React.FC = () => { const [workOrders, setWorkOrders] = useState(mockWorkOrders) const [searchTerm, setSearchTerm] = useState('') const [selectedStatus, setSelectedStatus] = useState('all') const [selectedPriority, setSelectedPriority] = useState('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, ) => { 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