ya-zagruzil-fayly-prikaz-na/prd.md

78 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PRD — «График отпусков»
Продуктовый документ (Product Requirements Document). Описывает, зачем нужен проект, что он делает и как устроен.
---
## 1. Цель проекта
Автоматизировать учёт отпусков сотрудников по приказам (PDF). Раньше приходилось открывать каждый приказ вручную и выписывать данные; теперь приказы складываются в папку, а система сама извлекает ФИО, период отпуска, тип и показывает сводный график.
**Кому нужно:** HR-отдел / отдел кадров, который ведёт график отпусков по приказам.
## 2. Что делает система (функциональность)
- **Читает приказы на отпуск** из папки `orders/` (файлы PDF).
- **Извлекает данные автоматически**: ФИО, должность, отдел, дата начала и конца отпуска, количество дней, номер и дата приказа, тип отпуска (ежегодный / социальный / экологический).
- **Сохраняет данные** в файл `vacations.json` — переживают перезапуск.
- **Показывает сводку в браузере**:
- статистика сверху (всего сотрудников, в отпуске сейчас, планируется, приказов обработано);
- таблица всех отпусков с поиском по ФИО/должности/отделу и фильтром по типу отпуска;
- карточки сотрудников с полным списком их отпусков.
## 3. Как устроено (технически)
| Часть | Что это |
|---|---|
| `server.js` | Сервер на Node.js (стандартный `node:http`), разбирает PDF и отдаёт данные через API |
| `orders/` | Папка, куда кладутся приказы на отпуск (PDF) |
| `vacations.json` | Файл-хранилище распознанных данных |
| `index.html` | Интерфейс (статистика, поиск, фильтры, таблица, карточки сотрудников) |
| `package.json` | Конфигурация запуска (`node server.js`) |
### Данные об одном отпуске (запись в `vacations.json`)
- `fullName` — ФИО сотрудника
- `position` — должность
- `department` — отдел (например, «Служба активации сетевых сервисов»)
- `startDate` / `endDate` — начало и конец отпуска (ДД.ММ.ГГГГ)
- `days` — количество календарных дней
- `orderNumber` / `orderDate` — номер и дата приказа
- `type` — тип отпуска: «Ежегодный оплачиваемый», «Социальный», «Экологический»
- `fileName` — имя исходного PDF-файла
## 4. Основные сценарии
1. **Сотрудник выходит в отпуск по приказу.** HR кладёт приказ (PDF) в папку `orders/` и нажимает в интерфейсе «обновить» → система разбирает приказ и добавляет запись в график.
2. **Проверить, кто в отпуске сейчас.** Открывается страница — наверху счётчик «В отпуске сейчас».
3. **Найти отпуск конкретного человека.** Ввод в поиск ФИО → таблица и карточки фильтруются.
4. **Посмотреть все отпуска одного типа** (например, социальные) — фильтр-кнопки над таблицей.
## 5. API сервера
| Метод | Путь | Что делает |
|---|---|---|
| GET | `/api/vacations` | Возвращает список всех отпусков (JSON) |
| GET | `/api/refresh` | Заново сканирует папку `orders/`, перечитывает PDF, сохраняет в `vacations.json` и возвращает обновлённый список |
## 6. Известные ограничения (текущая версия)
- Приказ должен быть PDF **с текстовым слоем** — отсканированные без распознавания PDF распознаются не полностью.
- Распознавание полей (должность, отдел, номер приказа) срабатывает для типовых формулировок приказов; при другой форме текста часть полей может остаться пустой (ФИО, даты и тип обычно заполняются всегда).
- Автозагрузки новых приказов пока нет — после добавления PDF нужно нажать обновление.
- Нет выгрузки в Excel (планируется как доработка).
## 7. Планы на развитие (backlog)
- Кнопка «Выгрузить в Excel / CSV» для переноса графика в отчётность.
- Улучшенное распознавание должностей, отделов и номеров приказов.
- Поддержка отсканированных PDF (OCR).
- Автоматическое отслеживание новых файлов в папке.
- Редактирование записи вручную (если приказ распознался неточно).
## 8. Запуск
- Проект запускается командой `run` (сервер поднимается на порту `3000`).
- Интерфейс — обычная веб-страница в браузере; данные из API.
- После ~20 минут простоя сервер засыпает — повторный `run` снова поднимает всё с сохранёнными данными.