clinical-dashboard/PRD.md

236 lines
17 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 — Дашборд клинической кафедры медицинского университета
**Версия документа:** 1.0
**Дата:** 26.06.2026
**Владелец продукта:** Issida Ashirmatova
**Живая страница:** https://pages.git.vibe42.kz/Issida_Ashirmatova/clinical-dashboard/
**Репозиторий:** https://git.vibe42.kz/Issida_Ashirmatova/clinical-dashboard
---
## 1. Обзор продукта
Веб-дашборд для учёта преподавателей клинической кафедры медицинского университета. Представляет собой редактируемую таблицу, где каждый преподаватель — отдельная строка, а каждый параметр (ФИО, дата рождения, образование, научная степень, категория, сертификат специалиста, членство в ассоциациях, клиническая база) — вводимое поле. Дашборд строит многопараметрические отчёты и выгружает их в CSV.
Продукт реализован как **статический сайт** (HTML + CSS + JS) без сервера, базы данных и авторизации. Данные хранятся в браузере (localStorage).
---
## 2. Цели и задачи
### Цели
- Дать кафедре единое место для учёта кадрового состава преподавателей.
- Обеспечить ввод и редактирование данных непосредственно в таблице, без форм и модальных окон.
- Позволить получать аналитические отчёты по нескольким параметрам одновременно (например, «сколько преподавателей с научной степенью и какой категорией»).
### Задачи (метрики успеха)
- Ввод строки преподавателя занимает < 1 минуты.
- Отчёт по любому набору параметров строится мгновенно, без ручного подсчёта.
- Данные не теряются между перезагрузками страницы.
---
## 3. Целевые пользователи
| Роль | Сценарий |
|------|----------|
| **Ответственный по кафедре (администратор)** | Ведёт общую таблицу, собирает анкеты преподавателей, формирует отчёты для руководства. |
| **Преподаватель** | Вводит собственные данные в свою строку, выгружает анкету файлом и отправляет администратору. |
> ⚠️ Ограничение платформы: настоящая многопользовательская авторизация с общим хранилищем в статической песочнице невозможна. Поэтому совместная работа организована через экспорт/импорт файлов (см. раздел 9).
---
## 4. Контекст и ограничения платформы
Платформа учебная песочница Vibe42 (только статические сайты). Жёсткие ограничения:
- Статика: HTML + CSS + JS в браузере.
- Нет бэкенда, базы данных, Redis, Docker, nginx.
- Нет авторизации / OAuth / JWT.
- Нет тяжёлых сборщиков (npm-зависимостей).
- 📦 Данные хранятся в `localStorage` браузера (персонально для устройства и браузера).
---
## 5. Границы продукта (Scope)
### В объёме (In scope)
- Редактируемая таблица преподавателей со всеми параметрами.
- Расширяемый набор параметров (пользовательские поля).
- Статистические карточки (сводка по кафедре).
- Поиск и фильтрация.
- Многопараметрические отчёты с диаграммами и перекрёстной таблицей.
- Экспорт в CSV, импорт/экспорт JSON (резервные копии, сбор анкет).
### Вне объёма (Out of scope)
- Многопользовательский вход и общее серверное хранилище.
- Загрузка файлов/фотографий на сервер.
- Сложная бизнес-логика (расчёт стажа, автозаполнение из внешних баз).
- Уведомления и email-рассылки (возможно добавление позже через Formspree).
---
## 6. Пользовательские истории
1. Как администратор, я хочу добавить преподавателя и заполнить все его параметры прямо в таблице, чтобы не открывать отдельные формы.
2. Как администратор, я хочу редактировать любое поле строки одним кликом, чтобы быстро исправлять данные.
3. Как администратор, я хочу видеть сводку: сколько всего преподавателей, сколько с научной степенью, сколько с сертификатом.
4. Как администратор, я хочу построить отчёт одновременно по нескольким параметрам, чтобы анализировать состав кафедры.
5. Как администратор, я хочу выгрузить отчёт в CSV для предоставления руководству.
6. Как преподаватель, я хочу ввести свои данные и выгрузить анкету файлом, чтобы передать её администратору.
7. Как администратор, я хочу импортировать полученные анкеты, чтобы они добавились в общую таблицу без дубликатов.
8. Как администратор, я хочу добавлять собственные параметры (например, «стаж», «учёное звание»), чтобы учитывать специфику кафедры.
---
## 7. Функциональные требования
### 7.1. Структура интерфейса
- **Верхняя панель:** название, кнопки «+ Преподаватель», «⚙ Настроить поля», «⤓ Экспорт CSV», «⤒ Импорт».
- **Вкладки:** «Преподаватели» и «Отчёты».
- **Вкладка «Преподаватели»:** карточки статистики панель поиска/фильтров таблица.
- **Вкладка «Отчёты»:** выбор параметров графики распределения перекрёстная таблица сводка.
### 7.2. Таблица преподавателей (инлайн-редактирование)
- Каждая строка = один преподаватель.
- Каждый параметр = поле ввода прямо в ячейке.
- Типы полей зависят от параметра (см. раздел 8).
- **Автосохранение** в `localStorage` при вводе (с debounce ~350 мс).
- Действия по строке:
- `⤓` выгрузить анкету одного преподавателя в JSON.
- `🗑` удалить строку (с подтверждением).
- Кнопка «+ Преподаватель» добавляет пустую строку, фокус на поле «ФИО».
- Все базовые поля свободно вводимы (выпадающие поля редактируемые комбобоксы: выбор из подсказок **или** ввод своего значения).
### 7.3. Параметры преподавателя (модель данных)
**Базовые поля (нельзя удалить):**
| Ключ | Название | Тип | Обязательное | Варианты |
|------|----------|-----|--------------|----------|
| `fullName` | ФИО | text | да | |
| `birthDate` | Дата рождения | date | нет | |
| `education` | Образование | textarea | нет | |
| `academicDegree` | Научная степень | select (комбобокс) | нет | Нет / Кандидат наук / Доктор наук + свободный ввод |
| `category` | Категория | select (комбобокс) | нет | Нет / Вторая / Первая / Высшая + свободный ввод |
| `specialistCertificate` | Сертификат специалиста | text | нет | |
| `associations` | Членство в ассоциациях | text | нет | |
| `clinicalBase` | Клиническая база | text | нет | |
**Пользовательские поля:** добавляются через «⚙ Настроить поля». Доступные типы: текст, дата, число, выпадающий список (комбобокс), длинный текст, да/нет (чекбокс). Удаляемы (с подтверждением; значения у всех преподавателей теряются).
### 7.4. Статистика (карточки)
- Всего преподавателей.
- С научной степенью (кандидат / доктор).
- Докторов наук.
- С сертификатом специалиста.
- Члены ассоциаций.
Обновляется автоматически при редактировании таблицы.
### 7.5. Поиск и фильтрация
- Полнотекстовый поиск по всем полям.
- Фильтры: по научной степени, по категории, по клинической базе.
- Счётчик «Показано: X из Y».
### 7.6. Отчёты (многопараметрические)
- Выбор **нескольких** параметров чекбоксами.
- По каждому выбранному параметру диаграмма распределения (количество по значениям).
- По первым двум выбранным **перекрёстная таблица** (pivot): строки × столбцы, в ячейках количество преподавателей, с итогами по строкам/столбцам и общим.
- Сводка: всего преподавателей, % с научной степенью, число параметров в отчёте.
- Экспорт отчёта в CSV (все распределения + перекрёстная таблица).
- Пустые значения отображаются как «(не указано)».
### 7.7. Экспорт и импорт
- **Экспорт CSV** вся таблица преподавателей (заголовок из актуальных названий полей).
- **Резервная копия JSON** полное состояние (преподаватели + пользовательские поля), двойной клик по кнопке «Экспорт CSV».
- **Выгрузка анкеты** (⤓ в строке) JSON одного преподавателя.
- **Импорт** добавление анкет из файла с защитой от дублей по ФИО (регистронезависимо). Поддерживаемые форматы: `{teachers:[...], customFields:[...]}`, массив преподавателей, один объект-преподаватель. Пользовательские поля из файла тоже сливаются.
---
## 8. Модель данных
```
state = {
teachers: [
{
id: "t_...",
fullName: "...",
birthDate: "ГГГГ-ММ-ДД",
education: "...",
academicDegree: "Доктор наук",
category: "Высшая",
specialistCertificate: "...",
associations: "...",
clinicalBase: "...",
<customFieldKey>: <value>
}
],
customFields: [
{ key, label, type, options?, locked:false }
]
}
```
Хранение: `localStorage["clinical_dashboard_v1"]` = JSON.stringify(state).
---
## 9. Сценарий совместной работы (сбор анкет)
Поскольку общего сервера нет, используется файловый обмен:
1. Преподаватель открывает ссылку дашборда.
2. Вводит свои данные в новую строку.
3. Жмёт `⤓` в конце строки получает файл `anketa_ФИО.json`.
4. Отправляет файл администратору (email/мессенджер).
5. Администратор жмёт «⤒ Импорт» анкета добавляется в таблицу (дубли по ФИО отбрасываются).
---
## 10. Нефункциональные требования
- **Доступность:** работает в любом современном браузере, адаптивная вёрстка (десктоп/планшет/телефон), таблица скроллится по горизонтали на узких экранах.
- **Производительность:** таблица до ~200 строк работает без задержек; автосохранение дебаунсится.
- **Приватность:** данные не покидают браузер пользователя (кроме случаев ручного экспорта).
- **Отказоустойчивость:** при ошибке чтения localStorage приложение не падает, начинает с пустого состояния.
- **Интернационализация:** интерфейс на русском языке.
- **Палитра:** клиническая тема белый фон, тёмный текст, бирюзовый акцент (`#0891B2`).
---
## 11. Техническая реализация
| Файл | Назначение |
|------|------------|
| `index.html` | Структура страницы, вкладки, модальные окна. |
| `styles.css` | Оформление (клиническая тема, таблицы, карточки, отчёты). |
| `app.js` | Вся логика: состояние, рендеринг, автосохранение, отчёты, экспорт/импорт. |
Стек: чистый vanilla JS, без фреймворков и сборщиков. Публикация push в ветку `pages` Gitea, Caddy обслуживает статике мгновенно.
---
## 12. Дорожная карта (Roadmap)
| Приоритет | Возможность |
|-----------|-------------|
| Высокий | Форма самостоятельной подачи анкеты преподавателем через Formspree/Getform (без файлов, отправка на email администратора). |
| Высокий | Общее хранилище через опубликованный Google Sheets CSV для настоящей многопользовательской работы. |
| Средний | Экспорт отчётов в PDF / печать. |
| Средний | Загрузка фото преподавателя (avatar, base64 в localStorage). |
| Средний | Валидация полей (формат даты, обязательность). |
| Низкий | Журнал изменений (audit log). |
| Низкий | Роли: просмотр только для преподавателей, редактирование для администратора. |
---
## 13. Глоссарий
- **Комбобокс** поле, совмещающее выпадающий список подсказок и свободный ввод текста.
- **Перекрёстная таблица (pivot)** таблица сопряжённости: строки и столбцы значения двух параметров, в ячейках количество объектов с данной комбинацией.
- **localStorage** хранилище данных в браузере пользователя.
- **CSV** текстовый формат таблицы, открывается в Excel/Numbers.
- **JSON** формат для резервных копий и обмена анкетами.