import React, { useState } from "react"; import { FaCalendar, FaBullseye, // Keep for icon consistency if needed elsewhere } from "react-icons/fa"; import { MrpMaterialRequirement, RequirementSourceTypeEnum, } from "../../../types/mrp"; import DataTable, { Column } from "../../../components/common/DataTable"; import { getRequirementSourceTypeColor, getRequirementSourceTypeText, } from "../../../utils/erp"; interface MaterialRequirementsProps { materialRequirements: MrpMaterialRequirement[]; } const MaterialRequirements: React.FC = ({ materialRequirements, }) => { const [searchTerm, setSearchTerm] = useState(""); const [selectedSource, setSelectedSource] = useState< RequirementSourceTypeEnum | "all" >("all"); const [sortBy, setSortBy] = useState<"date" | "quantity" | "priority">( "date" ); // Event handlers const handleViewDetails = (requirement: MrpMaterialRequirement) => { console.log("View requirement details:", requirement); }; const filteredRequirements = materialRequirements .filter((req) => { if ( searchTerm && !req.material?.name?.toLowerCase().includes(searchTerm.toLowerCase()) && !req.material?.code?.toLowerCase().includes(searchTerm.toLowerCase()) ) { return false; } if (selectedSource !== "all" && req.sourceType !== selectedSource) { return false; } return true; }) .sort((a, b) => { switch (sortBy) { case "date": return ( new Date(a.requirementDate).getTime() - new Date(b.requirementDate).getTime() ); case "quantity": return b.netRequirement - a.netRequirement; case "priority": return b.grossRequirement - a.grossRequirement; default: return 0; } }); const getUrgencyLevel = (requirement: MrpMaterialRequirement) => { const today = new Date(); const reqDate = new Date(requirement.requirementDate); const daysUntilRequired = Math.ceil( (reqDate.getTime() - today.getTime()) / (1000 * 60 * 60 * 24) ); if (daysUntilRequired < 0) return { level: "overdue", color: "bg-red-100 text-red-800", label: "Gecikmiş", }; if (daysUntilRequired <= 7) return { level: "urgent", color: "bg-orange-100 text-orange-800", label: "Acil", }; if (daysUntilRequired <= 30) return { level: "soon", color: "bg-yellow-100 text-yellow-800", label: "Yakın", }; return { level: "normal", color: "bg-green-100 text-green-800", label: "Normal", }; }; const requirementColumns: Column[] = [ { key: "material", header: "Malzeme", sortable: true, render: (req: MrpMaterialRequirement) => (
{req.material?.name || `Material-${req.materialId.substring(0, 8)}`}
{req.material?.code}
), }, { key: "sourceType", header: "Kaynak", render: (req: MrpMaterialRequirement) => ( {getRequirementSourceTypeText(req.sourceType)} ), }, { key: "urgency", header: "Aciliyet", render: (req: MrpMaterialRequirement) => { const urgency = getUrgencyLevel(req); return ( {urgency.label} ); }, }, { key: "requirements", header: "İhtiyaçlar", render: (req: MrpMaterialRequirement) => (
Brüt: {req.grossRequirement.toLocaleString()}
Mevcut: {req.projectedAvailable.toLocaleString()}
Net: 0 ? "text-red-600" : "text-green-600" }`} > {req.netRequirement.toLocaleString()}
), }, { key: "scheduled", header: "Planlanan", render: (req: MrpMaterialRequirement) => (
Gelen: {req.scheduledReceipts.toLocaleString()}
Sipariş: {req.plannedOrderReceipt.toLocaleString()}
), }, { key: "dates", header: "Tarihler", render: (req: MrpMaterialRequirement) => (
İhtiyaç:{" "} {new Date(req.requirementDate).toLocaleDateString("tr-TR")}
Plan:{" "} {new Date(req.plannedReceiptDate).toLocaleDateString("tr-TR")}
), }, { key: "actions", header: "İşlemler", render: (req: MrpMaterialRequirement) => ( ), }, ]; return ( <> {/* Filters */}
setSearchTerm(e.target.value)} className="w-full px-2 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Data Table */}
); }; export default MaterialRequirements;