import React, { useState } from "react"; import { FaBriefcase, FaPlus, FaEdit, FaTrash, FaUsers, FaDollarSign, FaBuilding, FaEye, FaTh, FaList, } from "react-icons/fa"; import { HrJobPosition, JobLevelEnum } from "../../../types/hr"; import DataTable, { Column } from "../../../components/common/DataTable"; import { mockJobPositions } from "../../../mocks/mockJobPositions"; import JobPositionFormModal from "./JobPositionFormModal"; import JobPositionViewModal from "./JobPositionViewModal"; import { getJobLevelColor, getJobLevelText } from "../../../utils/erp"; const JobPositions: React.FC = () => { const [positions, setPositions] = useState(mockJobPositions); const [searchTerm, setSearchTerm] = useState(""); const [selectedLevel, setSelectedLevel] = useState("all"); const [selectedDepartment, setSelectedDepartment] = useState("all"); const [viewMode, setViewMode] = useState<"list" | "card">("list"); // Modal states const [isFormModalOpen, setIsFormModalOpen] = useState(false); const [isViewModalOpen, setIsViewModalOpen] = useState(false); const [selectedPosition, setSelectedPosition] = useState< HrJobPosition | undefined >(undefined); const [modalTitle, setModalTitle] = useState(""); const handleAdd = () => { setSelectedPosition(undefined); setModalTitle("Yeni İş Pozisyonu"); setIsFormModalOpen(true); }; const handleEdit = (position: HrJobPosition) => { setSelectedPosition(position); setModalTitle("İş Pozisyonu Düzenle"); setIsFormModalOpen(true); }; const handleView = (position: HrJobPosition) => { setSelectedPosition(position); setIsViewModalOpen(true); }; const handleDelete = (id: string) => { if (window.confirm("Bu pozisyonu silmek istediğinizden emin misiniz?")) { setPositions(positions.filter((p) => p.id !== id)); } }; const handleSavePosition = (positionData: Partial) => { if (selectedPosition) { // Edit existing position const updatedPosition = { ...selectedPosition, ...positionData, lastModificationTime: new Date(), }; setPositions( positions.map((p) => p.id === selectedPosition.id ? updatedPosition : p ) ); } else { // Add new position const newPosition: HrJobPosition = { id: `jp-${Date.now()}`, ...positionData, employees: [], creationTime: new Date(), lastModificationTime: new Date(), } as HrJobPosition; setPositions([...positions, newPosition]); } }; const closeFormModal = () => { setIsFormModalOpen(false); setSelectedPosition(undefined); setModalTitle(""); }; const closeViewModal = () => { setIsViewModalOpen(false); setSelectedPosition(undefined); }; const filteredPositions = positions.filter((position) => { if ( searchTerm && !position.name.toLowerCase().includes(searchTerm.toLowerCase()) && !position.code.toLowerCase().includes(searchTerm.toLowerCase()) ) { return false; } if (selectedLevel !== "all" && position.level !== selectedLevel) { return false; } if ( selectedDepartment !== "all" && position.department?.id !== selectedDepartment ) { return false; } return true; }); // Card component for individual position const PositionCard: React.FC<{ position: HrJobPosition }> = ({ position, }) => (

{position.name}

{getJobLevelText(position.level)}

{position.code}

{position.description}

{position.isActive ? "Aktif" : "Pasif"}
{position.department?.name || "Departman belirtilmemiş"}
{position.employees?.length || 0} personel
₺{position.minSalary.toLocaleString()} - ₺ {position.maxSalary.toLocaleString()}

Gerekli Yetenekler

{position.requiredSkills?.slice(0, 4).map((skill, index) => ( {skill} ))} {position.requiredSkills?.length > 4 && ( +{position.requiredSkills.length - 4} daha )}
); const columns: Column[] = [ { key: "code", header: "Pozisyon Kodu", sortable: true, }, { key: "title", header: "Pozisyon Adı", sortable: true, render: (position: HrJobPosition) => (
{position.name}
{position.description}
), }, { key: "department", header: "Departman", render: (position: HrJobPosition) => (
{position.department?.name || "-"}
), }, { key: "level", header: "Seviye", render: (position: HrJobPosition) => ( {getJobLevelText(position.level)} ), }, { key: "employeeCount", header: "Personel Sayısı", render: (position: HrJobPosition) => (
{position.employees?.length || 0}
), }, { key: "salary", header: "Maaş Aralığı", render: (position: HrJobPosition) => (
₺{position.minSalary.toLocaleString()}
₺{position.maxSalary.toLocaleString()}
), }, { key: "skills", header: "Gerekli Yetenekler", render: (position: HrJobPosition) => (
{position.requiredSkills?.slice(0, 3).map((skill, index) => ( {skill} ))} {position.requiredSkills?.length > 3 && ( +{position.requiredSkills.length - 3} daha )}
), }, { key: "status", header: "Durum", render: (position: HrJobPosition) => ( {position.isActive ? "Aktif" : "Pasif"} ), }, { key: "actions", header: "İşlemler", render: (position: HrJobPosition) => (
), }, ]; // Get unique departments for filter const departments = [ ...new Set(positions.map((p) => p.department).filter(Boolean)), ]; return (
{/* Header */}

İş Pozisyonları

Şirket pozisyonları ve iş tanımları yönetimi

{/* View Toggle */}
{/* Stats Cards */}

Toplam Pozisyon

{positions.length}

Dolu Pozisyonlar

{ positions.filter((p) => p.employees && p.employees.length > 0) .length }

Boş Pozisyonlar

{ positions.filter( (p) => !p.employees || p.employees.length === 0 ).length }

Departman Sayısı

{departments.length}

{/* 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" />
{/* Content - List or Card View */} {viewMode === "list" ? (
) : (
{filteredPositions.map((position) => ( ))}
)} {/* Empty State */} {filteredPositions.length === 0 && (

Pozisyon bulunamadı

Arama kriterlerinizi değiştirmeyi deneyin.

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