# СИСТЕМА УПРАВЛЕНИЯ СОТРУДНИКАМИ
## 🎯 ОБЗОР СИСТЕМЫ
Система управления персоналом SFERA включает полный цикл HR-процессов: от найма до ведения табелей учета рабочего времени. Система предназначена для **фулфилмент-центров** и обеспечивает управление командой сотрудников.
## 📊 МОДЕЛИ ДАННЫХ
### Модель Employee (Сотрудник)
```typescript
// Prisma модель Employee
model Employee {
id String @id @default(cuid())
firstName String // Имя
lastName String // Фамилия
middleName String? // Отчество (опционально)
birthDate DateTime? // Дата рождения
avatar String? // Аватар сотрудника
// Паспортные данные
passportPhoto String? // Фото паспорта
passportSeries String? // Серия паспорта
passportNumber String? // Номер паспорта
passportIssued String? // Кем выдан
passportDate DateTime? // Дата выдачи
// Рабочая информация
position String // Должность (обязательно)
department String? // Отдел
hireDate DateTime // Дата найма (обязательно)
salary Float? // Зарплата
status EmployeeStatus @default(ACTIVE)
// Контактная информация
phone String // Телефон (обязательно)
email String? // Email
telegram String? // Telegram
whatsapp String? // WhatsApp
address String? // Адрес проживания
emergencyContact String? // Контакт для экстренных случаев
emergencyPhone String? // Телефон экстренного контакта
// Связи
organizationId String
organization Organization @relation(fields: [organizationId], references: [id])
scheduleRecords EmployeeSchedule[] // Записи табеля
supplyOrders SupplyOrder[] @relation("SupplyOrderResponsible")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
```
### Модель EmployeeSchedule (Табель)
```typescript
// Система учета рабочего времени
model EmployeeSchedule {
id String @id @default(cuid())
date DateTime // Дата (уникальная для каждого сотрудника)
status ScheduleStatus // Статус дня
hoursWorked Float? // Отработанные часы
overtimeHours Float? // Сверхурочные часы
notes String? // Заметки к дню
employeeId String // ID сотрудника
employee Employee @relation(fields: [employeeId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Уникальная связка: один сотрудник = одна запись на дату
@@unique([employeeId, date])
}
```
### Енумы статусов
```typescript
// Статусы сотрудника
enum EmployeeStatus {
ACTIVE // Активен (работает)
VACATION // В отпуске
SICK // На больничном
FIRED // Уволен
}
// Статусы дня в табеле
enum ScheduleStatus {
WORK // Рабочий день
WEEKEND // Выходной
VACATION // Отпуск
SICK // Больничный
ABSENT // Прогул/отсутствие
}
```
## 🏗️ АРХИТЕКТУРА КОМПОНЕНТОВ
### Главный дашборд
```typescript
// EmployeesDashboard - центральная точка управления (50+ строк кода)
const EmployeesDashboard = () => {
const { data: employees, loading } = useQuery(GET_MY_EMPLOYEES)
const [createEmployee] = useMutation(CREATE_EMPLOYEE)
const [updateEmployee] = useMutation(UPDATE_EMPLOYEE)
const [deleteEmployee] = useMutation(DELETE_EMPLOYEE)
// Табы навигации
const tabs = [
{ id: 'list', label: 'Список сотрудников', icon: Users },
{ id: 'calendar', label: 'Календарь', icon: Calendar },
{ id: 'reports', label: 'Отчеты', icon: FileText }
]
return (
{tabs.map(tab => (
{tab.label}
))}
)
}
```
### Модульная структура компонентов
```
src/components/employees/
├── employees-dashboard.tsx # 🎯 Главный оркестратор
├── employees-list.tsx # 📋 Список сотрудников
├── employee-row.tsx # 📄 Строка сотрудника в списке
├── employee-card.tsx # 🃏 Карточка сотрудника
├── employee-search.tsx # 🔍 Поиск и фильтрация
├── employee-stats.tsx # 📊 Статистика по сотрудникам
│
├── employee-form.tsx # ➕ Форма создания/редактирования
├── employee-inline-form.tsx # ✏️ Быстрое редактирование
├── employee-compact-form.tsx # 📝 Компактная форма
├── employee-edit-inline-form.tsx # ✏️ Инлайн редактирование
│
├── employee-calendar.tsx # 📅 Календарь сотрудника
├── employee-schedule.tsx # ⏰ Расписание работы
├── day-edit-modal.tsx # 🪟 Модальное окно редактирования дня
├── bulk-edit-modal.tsx # 🪟 Массовое редактирование
├── month-navigation.tsx # 🗓️ Навигация по месяцам
│
├── employee-reports.tsx # 📈 Отчеты по сотрудникам
├── employee-legend.tsx # 🏷️ Легенда статусов
├── employee-header.tsx # 📋 Заголовок секции
├── employee-empty-state.tsx # 🚫 Пустое состояние
└── employee-item.tsx # 📦 Элемент сотрудника
```
## 📅 СИСТЕМА ТАБЕЛЬНОГО УЧЕТА
### Календарь сотрудника
```typescript
// EmployeeCalendar - управление табелем рабочего времени
const EmployeeCalendar = ({
employeeId,
employeeSchedules,
currentYear,
currentMonth,
onDayUpdate,
employeeName
}: EmployeeCalendarProps) => {
const [selectedDate, setSelectedDate] = useState(null)
const [bulkEditMode, setBulkEditMode] = useState(false)
// Обработчик сохранения дня
const handleDaySave = (data: {
status: string
hoursWorked?: number
overtimeHours?: number
notes?: string
}) => {
if (!selectedDate) return
onDayUpdate(employeeId, selectedDate, data)
setSelectedDate(null)
}
// Генерация календарной сетки
const generateCalendarDays = () => {
const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate()
const firstDay = new Date(currentYear, currentMonth, 1).getDay()
const days = []
// Пустые ячейки в начале месяца
for (let i = 0; i < firstDay; i++) {
days.push(null)
}
// Дни месяца с данными табеля
for (let day = 1; day <= daysInMonth; day++) {
const scheduleRecord = getScheduleForDay(day)
days.push({
date: day,
status: scheduleRecord?.status || 'work',
hoursWorked: scheduleRecord?.hoursWorked || 8,
overtimeHours: scheduleRecord?.overtimeHours || 0
})
}
return days
}
return (