import React, { useState } from 'react'; import { SchoolData, Employee, EmployeeCategory } from '../types'; import { Plus, Edit2, Trash2, X, Search, Users, Briefcase, Calendar, Phone, Mail, FileText, Settings2 } from 'lucide-react'; import { useDialog } from '../DialogContext'; interface EmployeesProps { data: SchoolData; updateData: (newData: Partial) => void; } const Employees: React.FC = ({ data, updateData }) => { const { showAlert, showConfirm } = useDialog(); const [searchTerm, setSearchTerm] = useState(''); const [isModalOpen, setIsModalOpen] = useState(false); const [isCategoryModalOpen, setIsCategoryModalOpen] = useState(false); const [isClosing, setIsClosing] = useState(false); const [editingEmployee, setEditingEmployee] = useState(null); const [editingCategory, setEditingCategory] = useState(null); const [formData, setFormData] = useState>({ name: '', cpf: '', phone: '', email: '', admissionDate: new Date().toISOString().split('T')[0], categoryId: '' }); const [categoryFormData, setCategoryFormData] = useState({ name: '' }); const employees = data.employees || []; const categories = data.employeeCategories || []; const filteredEmployees = employees.filter(emp => (emp.name || '').toLowerCase().includes((searchTerm || '').toLowerCase()) || (emp.cpf || '').includes(searchTerm || '') || (emp.email || '').toLowerCase().includes((searchTerm || '').toLowerCase()) ); const closeModal = () => { setIsClosing(true); setTimeout(() => { setIsModalOpen(false); setIsClosing(false); setEditingEmployee(null); setFormData({ name: '', cpf: '', phone: '', email: '', admissionDate: new Date().toISOString().split('T')[0], categoryId: '' }); }, 400); }; const closeCategoryModal = () => { setIsCategoryModalOpen(false); setEditingCategory(null); setCategoryFormData({ name: '' }); }; const handleEdit = (emp: Employee) => { setEditingEmployee(emp); setFormData({ name: emp.name, cpf: emp.cpf, phone: emp.phone, email: emp.email, admissionDate: emp.admissionDate, categoryId: emp.categoryId }); setIsModalOpen(true); }; const handleDelete = (emp: Employee) => { showConfirm( 'Remover Funcionário', `Tem certeza que deseja remover ${emp.name}?`, () => { const updatedEmployees = employees.filter(e => e.id !== emp.id); updateData({ employees: updatedEmployees }); showAlert('Sucesso', 'Funcionário removido com sucesso.', 'success'); } ); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!formData.categoryId) { showAlert('Atenção', 'Selecione uma categoria para o funcionário.', 'warning'); return; } if (editingEmployee) { const updatedEmployees = employees.map(emp => emp.id === editingEmployee.id ? { ...formData, id: emp.id } : emp ); updateData({ employees: updatedEmployees }); showAlert('Sucesso', 'Funcionário atualizado com sucesso.', 'success'); } else { const newEmployee: Employee = { ...formData, id: crypto.randomUUID() }; updateData({ employees: [...employees, newEmployee] }); showAlert('Sucesso', 'Funcionário cadastrado com sucesso.', 'success'); } closeModal(); }; const handleCategorySubmit = (e: React.FormEvent) => { e.preventDefault(); if (!categoryFormData.name.trim()) return; if (editingCategory) { const updatedCategories = categories.map(cat => cat.id === editingCategory.id ? { ...cat, name: categoryFormData.name } : cat ); updateData({ employeeCategories: updatedCategories }); } else { const newCategory: EmployeeCategory = { id: crypto.randomUUID(), name: categoryFormData.name }; updateData({ employeeCategories: [...categories, newCategory] }); } setCategoryFormData({ name: '' }); setEditingCategory(null); }; const handleDeleteCategory = (cat: EmployeeCategory) => { const hasEmployees = employees.some(emp => emp.categoryId === cat.id); if (hasEmployees) { showAlert('Atenção', 'Não é possível excluir uma categoria que possui funcionários vinculados.', 'warning'); return; } showConfirm( 'Remover Categoria', `Deseja remover a categoria "${cat.name}"?`, () => { const updatedCategories = categories.filter(c => c.id !== cat.id); updateData({ employeeCategories: updatedCategories }); } ); }; const inputClass = "w-full px-4 py-3 bg-white text-black border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 transition-all shadow-sm"; return (
{/* Header */}

Funcionários

Gerencie sua equipe e categorias profissionais.

{/* Search and Stats */}
setSearchTerm(e.target.value)} />

Total Equipe

{employees.length}

{/* Employees Grid */}
{filteredEmployees.map(emp => { const category = categories.find(c => c.id === emp.categoryId); return (

{emp.name}

{category?.name || 'Sem Categoria'}
CPF: {emp.cpf}
{emp.phone}
{emp.email}
Admissão: {new Date(emp.admissionDate).toLocaleDateString('pt-BR')}
); })}
{employees.length === 0 && (

Nenhum funcionário cadastrado

Comece adicionando os membros da sua equipe.

)} {/* Employee Modal */} {isModalOpen && (

{editingEmployee ? 'Editar Funcionário' : 'Novo Funcionário'}

Preencha os dados profissionais.

setFormData({ ...formData, name: e.target.value })} />
{ const val = e.target.value.replace(/\D/g, '').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d{1,2})/, '$1-$2').slice(0, 14); setFormData({ ...formData, cpf: val }); }} />
{ const val = e.target.value.replace(/\D/g, '').replace(/(\d{2})(\d)/, '($1) $2').replace(/(\d{5})(\d)/, '$1-$2').slice(0, 15); setFormData({ ...formData, phone: val }); }} />
setFormData({ ...formData, email: e.target.value })} />
setFormData({ ...formData, admissionDate: e.target.value })} />
)} {/* Categories Modal */} {isCategoryModalOpen && (

Gerenciar Categorias

setCategoryFormData({ name: e.target.value })} />
{categories.map(cat => (
{cat.name}
))} {categories.length === 0 && (

Nenhuma categoria cadastrada.

)}
)}
); }; export default Employees;