import React, { useState } from "react"; import { FaPlus, FaEdit, FaTrash, FaBuilding, FaUsers, FaDollarSign, FaEye, FaList, FaTh, } from "react-icons/fa"; import { HrDepartment } from "../../../types/hr"; import DataTable, { Column } from "../../../components/common/DataTable"; import { mockDepartments } from "../../../mocks/mockDepartments"; import { mockEmployees } from "../../../mocks/mockEmployees"; import { mockCostCenters } from "../../../mocks/mockCostCenters"; import DepartmentFormModal from "./DepartmentFormModal"; import DepartmentViewModal from "./DepartmentViewModal"; import Widget from "../../../components/common/Widget"; const DepartmentManagement: React.FC = () => { const [departments, setDepartments] = useState(mockDepartments); const [searchTerm, setSearchTerm] = useState(""); const [selectedParent, setSelectedParent] = useState("all"); const [viewMode, setViewMode] = useState<"list" | "cards">("list"); // Modal states const [isFormModalOpen, setIsFormModalOpen] = useState(false); const [isViewModalOpen, setIsViewModalOpen] = useState(false); const [selectedDepartment, setSelectedDepartment] = useState< HrDepartment | undefined >(); const [modalTitle, setModalTitle] = useState(""); const handleAdd = () => { setSelectedDepartment(undefined); setModalTitle("Yeni Departman"); setIsFormModalOpen(true); }; const handleEdit = (department: HrDepartment) => { setSelectedDepartment(department); setModalTitle("Departman Düzenle"); setIsFormModalOpen(true); }; const handleView = (department: HrDepartment) => { setSelectedDepartment(department); setIsViewModalOpen(true); }; const handleDelete = (id: string) => { if (confirm("Bu departmanı silmek istediğinizden emin misiniz?")) { setDepartments((prev) => prev.filter((dept) => dept.id !== id)); } }; const handleSave = (departmentData: Partial) => { if (selectedDepartment) { // Edit existing department setDepartments((prev) => prev.map((dept) => dept.id === selectedDepartment.id ? { ...dept, ...departmentData, lastModificationTime: new Date() } : dept ) ); } else { // Add new department const newDepartment: HrDepartment = { id: `dept_${Date.now()}`, ...departmentData, subDepartments: [], creationTime: new Date(), lastModificationTime: new Date(), } as HrDepartment; setDepartments((prev) => [...prev, newDepartment]); } setIsFormModalOpen(false); }; const handleCloseFormModal = () => { setIsFormModalOpen(false); setSelectedDepartment(undefined); }; const handleCloseViewModal = () => { setIsViewModalOpen(false); setSelectedDepartment(undefined); }; const handleEditFromView = (department: HrDepartment) => { setIsViewModalOpen(false); handleEdit(department); }; mockDepartments.forEach((dept) => { if (dept.managerId) { dept.manager = mockEmployees.find((emp) => emp.id === dept.managerId); } if (dept.costCenterId) { dept.costCenter = mockCostCenters.find( (cc) => cc.id === dept.costCenterId ); } }); const filteredDepartments = departments.filter((department) => { if ( searchTerm && !department.name.toLowerCase().includes(searchTerm.toLowerCase()) && !department.code.toLowerCase().includes(searchTerm.toLowerCase()) ) { return false; } if ( selectedParent !== "all" && department.parentDepartmentId !== selectedParent ) { return false; } return true; }); const columns: Column[] = [ { key: "code", header: "Departman Kodu", sortable: true, }, { key: "name", header: "Departman Adı", sortable: true, }, { key: "parentDepartment", header: "Üst Departman", render: (department: HrDepartment) => department.parentDepartment?.name || "-", }, { key: "manager", header: "Yönetici", render: (department: HrDepartment) => department.manager?.fullName || "-", }, { key: "employeeCount", header: "Personel Sayısı", render: (department: HrDepartment) => (
{mockEmployees.filter((a) => a.departmantId == department.id) .length || 0}
), }, { key: "costCenter", header: "Maliyet Merkezi", render: (department: HrDepartment) => (
{department.costCenter?.code || "-"} {department.costCenter?.name || "-"}
), }, { key: "budget", header: "Bütçe", render: (department: HrDepartment) => (
{department.budget ? `₺${department.budget.toLocaleString()}` : "-"}
), }, { key: "status", header: "Durum", render: (department: HrDepartment) => ( {department.isActive ? "Aktif" : "Pasif"} ), }, { key: "actions", header: "İşlemler", render: (department: HrDepartment) => (
), }, ]; return (
{/* Header */}

Departman Yönetimi

Organizasyon yapısını ve departmanları yönetin

{/* View Mode Toggle */}
{/* Stats Cards */}
!d.parentDepartmentId).length} color="purple" icon="FaBuilding" /> total + (dept.budget || 0), 0) .toLocaleString()}`} color="orange" icon="FaDollarSign" />
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Data Display */} {viewMode === "list" ? (
) : (
{filteredDepartments.map((department) => (
{/* Card Header */}

{department.name}

{department.code}

{department.isActive ? "Aktif" : "Pasif"}
{/* Card Content */}
{department.parentDepartment && (
Üst: {department.parentDepartment.name}
)} {department.manager && (
Yönetici: {department.manager.fullName}
)}
{ mockEmployees.filter( (emp) => emp.departmantId === department.id ).length }{" "} Personel
{department.budget && (
₺{department.budget.toLocaleString()}
)} {department.costCenter && (
{department.costCenter.code}
{department.costCenter.name}
)}
{/* Card Actions */}
))}
)} {filteredDepartments.length === 0 && (

Departman bulunamadı

Arama kriterlerinizi değiştirmeyi deneyin.

)} {/* Modals */}
); }; export default DepartmentManagement;