Files
stroy-bot-monorepo/docs/TEST-PLAN.md
T
Тимур Городецкий a98162fce7 feat: save works imported from Excel
After a clean check the page loads the existing works of each object and
shows how many works will be created and updated. "Import" writes them
with the same requests as the work dialog: a work with the same title on
the object gets only its planned volume and unit updated, so loading the
same file again does not duplicate works.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-22 17:52:41 +05:00

255 lines
35 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.
# План ручной проверки StroyBot
Пошаговая проверка нового приложения перед выкаткой. Дополняет `MIGRATION-CHECKLIST.md` (там — список функций, здесь — что нажать и что должно получиться).
**Правила**
- Всё, что **записывает** данные (создать / изменить / удалить / импорт / утвердить), — **только на проекте «ТЕСТ StroyBot»**. Такие сценарии помечены ✍️.
- Всё, что только **читает**, проверяем на настоящих проектах — **сравнением со старой страницей** (см. «Главный приём»).
- Нашёл расхождение — не исправляй ничего сам, запиши по шаблону «Как сообщить о баге» и иди дальше.
- **Оформление — в стиле ui-kit** (решение 2026-10-16). Отличия во внешнем виде от старых страниц (раскладка, цвета, регистр подписей) **багом не считаются**. Сравниваем функции, тексты, данные, права. Баг по виду — только если что-то не видно, обрезано, наезжает или не нажимается.
- Отметки: `[x]` — совпало, `[!]` — баг (номер бага рядом), `[-]` — не применимо.
---
## 0. Подготовка (один раз)
### 0.1 Тестовые данные в SharePoint (`/sites/stroy`)
- [ ] В списке **«Проекты»** создать проект **«ТЕСТ StroyBot»**, статус **текущий**. Записать его `Id` (видно в адресе элемента): `Id = ____`.
- [ ] В списке **«Доступы»** создать строку: проект = «ТЕСТ StroyBot», пользователь = **ты**, `read` = да, `edit0` = да, `aproove` = нет.
- Это **разные поля в разных старых web parts** (lookup `project`/`user` и поля `projectId`/`userId`). Если при создании строки видно оба набора — заполни оба. Запиши, какие поля реально есть в списке: `________________`.
- [ ] В списке **«Объекты»** — пока ничего, объекты создадим в приложении (T-OBJ).
- [ ] Убедись, что в **«Смены»**, **«Компании»**, **«Профессии»**, **«Техника»**, **«Единицы измерения»** есть хотя бы по 2 элемента.
### 0.2 Переключение ролей одним аккаунтом
Роли меняются правкой **твоей строки «Доступы»** у «ТЕСТ StroyBot», статус проекта — полем **Status** в «Проекты». После правки — **F5** в приложении.
| Роль | read | edit0 | aproove |
|---|---|---|---|
| **Р** — только чтение | да | нет | нет |
| **Е** — редактор | да | да | нет |
| **У** — утверждающий | да | нет | да |
| **Н** — нет доступа | нет | нет | нет |
Начальная роль — **Е**.
### 0.3 Запуск workbench
1. В терминале VS Code (`` Ctrl+` ``) в папке `stroy-bot-monorepo`: `npx heft start`. Дождаться `Starting server`.
2. Открыть `https://tnsukz.sharepoint.com/sites/stroy/_layouts/workbench.aspx` (именно на сайте **stroy**, не корневом).
3. Разрешить загрузку отладочных скриптов, если браузер спросит.
4. **+** → web part **StroyBot**.
5. Держать открытыми **F12 → Console** и **F12 → Network** (фильтр `Fetch/XHR`) — туда смотрим при любой ошибке.
> Workbench не умеет одобрять API-разрешения. Если Dataverse или выгрузки упадут с ошибкой доступа/токена — это ожидаемо до выкатки пакета; помечай `[!]` с текстом ошибки, разберёмся.
---
## Главный приём — сравнение со старой страницей
Для любого раздела, который **показывает** данные:
1. Открыть **старую** страницу раздела (из старого stroy-bot-main) для проекта X.
2. Открыть **новый** раздел в workbench для того же проекта X.
3. Сравнить: количество строк, названия, числа, даты, порядок, бейджи, какие кнопки видны.
Проекты для сравнения — 2 настоящих: один **большой** (много объектов и отчётов), один **маленький**. Запиши:
- Большой: `________________` (Id `__`)
- Маленький: `________________` (Id `__`)
---
## 1. Оболочка — `T-APP`
- [ ] **T-APP-01** Открыть web part. Слева меню с одним пунктом «Проект», справа главная. Ошибок в Console нет.
- [ ] **T-APP-02** Выбрать проект → в меню появились разделы. Нажать «Объекты» → адрес стал `…?page=objects&projectId=…`.
- [ ] **T-APP-03** Нажать «назад» в браузере → вернулись на главную. «Вперёд» → снова объекты.
- [ ] **T-APP-04** Скопировать адрес раздела, открыть в новой вкладке → открылся тот же раздел того же проекта.
- [ ] **T-APP-05** F5 на любом разделе → остались в нём.
- [ ] **T-APP-06** В **той же вкладке** удалить из адреса `&page=…&projectId=…`, Enter, заново добавить web part → на главной уже выбран прежний проект, меню — со всеми разделами. (Выбор хранится в `sessionStorage` — он живёт только в пределах вкладки; после закрытия вкладки не сохраняется — так было и в старом main.)
- [ ] **T-APP-07** Шрифты подгрузились: заголовки разделов — с засечками (Lora), остальной текст — Inter.
- [ ] **T-APP-08** Узкое окно (< 768px) → меню прячется, появляется кнопка-бургер, меню открывается поверх.
## 2. Главная — `T-HUB` (сравнение со старым stroy-bot-main)
- [ ] **T-HUB-01** Клик в поле «Проект» → список; набор совпадает со старым main; сверху до 7 недавно активных.
- [ ] **T-HUB-02** Ввести часть названия (разный регистр) → фильтруется, не больше 7 строк; несуществующее → «Проекты не найдены».
- [ ] **T-HUB-03** Esc и клик мимо → список закрылся, в поле — выбранный проект.
- [ ] **T-HUB-04** Бейджи статусов совпадают по цвету: текущий — зелёный, завершён — серый, архивный — золотой, пусто — «Без статуса».
- [ ] **T-HUB-05** Без выбранного проекта все карточки неактивны, видна подсказка.
- [ ] **T-HUB-06** «ТЕСТ StroyBot», роль Е, статус **текущий** → все 6 карточек активны; меню — все разделы.
- [ ] **T-HUB-07** Роль **Р** → неактивна только «Отправить отчёт»; в меню нет «Отправить отчёт» и «Привязка к справочнику».
- [-] **T-HUB-08** Статус «завершен» — **не применимо**: в SharePoint у поля «Статус» только «Текущий» и «Архивный» (проверено 2026-10-16). Правило в коде остаётся на случай, если вариант появится.
- [ ] **T-HUB-09** Статус **«Архивный»** (менять в SharePoint, список «Проекты») → бейдж золотой, активен только «Архив», выгрузка неактивна, в меню только «Проект». Вернуть **«Текущий»**.
- ⚠️ Статус меняем **в списке SharePoint**, а не на портале проектов: портал пишет статус («Текущий» / «Архив») в справочник API, StroyBot его не читает.
- [ ] **T-HUB-10** «Архив проекта» → в новой вкладке папка `Документы/Архив/{проект}` (та же, что открывает старый main).
- [ ] **T-HUB-11** Ctrl+клик по карточке «Объекты» → раздел открылся в новой вкладке.
- [ ] **T-HUB-12** Выгрузка: «?» показывает 3 строки и закрывается кликом мимо. Даты 13.10–19.10 → «Отчёт за период»; 12.10–18.10 (Пн–Вс) → «Еженедельный»; один день → «Ежедневный»; начало позже конца → ошибка, кнопка неактивна.
- [ ] **T-HUB-13** «Выгрузить» на большом проекте за неделю → скачался `weekly_…xlsx`. **Сравнить** с файлом из старого main за тот же период — содержимое одинаковое.
### Сверка погодных условий — `T-WX` (фича из main от 16.10)
- [ ] **T-WX-01** Без дат или начало позже конца — «Сверка погодных условий» неактивна; обе даты верные — активна. Архивный проект — неактивна вместе с карточкой.
- [ ] **T-WX-02** Проект 17, неделя с отчётами → открылась сверка: шапка с проектом и периодом, метеостанция, «Погода по дням», «Позиции…». **Сравнить** со старым main за тот же период: те же строки и числа.
- [ ] **T-WX-03** «‹ Разделы проекта» → главная, даты остались. Ещё раз открыть сверку → «назад» браузера → главная, даты остались.
- [ ] **T-WX-04** Период без отчётов → «Нет позиций за период», кнопка оценки неактивна.
- [ ] **T-WX-05** Адрес `?page=weather&projectId=51` без дат → «Период не указан…». Меню слева подсвечивает «Проект».
- [ ] ✍️ **T-WX-06** Тестовый проект 51, 19.10.2026 (там есть позиции) → «Запросить оценку ИИ…» → спиннер до минуты → в «Оценке» и «Акте простоя» появились бейджи, сверху «Оценено позиций: N». Уйти назад во время оценки → ошибок в консоли нет.
- [ ] **T-WX-07** 360px: таблицы прокручиваются внутри своей рамки, страница целиком вбок не едет.
> ✅ **2026-10-20:** T-WX-01…05 пройдены. T-WX-02 — проект 35, 13.10–20.10: станция, все 8 дней и позиции совпали со старым main. T-WX-06 проверена на проекте 35 (оценено 138 позиций). T-WX-07 — на телефоне после деплоя (workbench не сужается до 360px), вместе с T-RSP-09.
## 3. Ресурсы проекта — `T-RES`
- [ ] **T-RES-01** Большой проект: вкладки «Профессии (N)», «Компании (N)» — числа и списки совпадают со старой страницей.
- [ ] **T-RES-02** Поиск слева, «✕» очищает; «уже добавлено» у привязанных.
- [ ] ✍️ **T-RES-03** «ТЕСТ StroyBot»: «+» у профессии → сразу справа; F5 → осталась. Проверить строку в «Профессии по проекту».
- [ ] ✍️ **T-RES-04** «−» → исчезла; F5 → не вернулась; строка удалена из списка.
- [ ] ✍️ **T-RES-05** То же для компании.
- [ ] **T-RES-06** Узкое окно → колонки друг под другом.
## 4. Привязка к справочнику — `T-BND`
- [ ] **T-BND-01** Большой проект: карточка проекта (описание, адрес, статус, даты, координаты) совпадает со старой страницей; бейдж «Привязан/Не привязан» тот же.
- [ ] **T-BND-02** Поиск по справочнику: результаты, «←/→», «стр / всего» — как в старой.
- [ ] ✍️ **T-BND-03** «ТЕСТ StroyBot»: выбрать проект справочника → «Связать» → сообщение успеха, бейдж «Привязан». В «Проекты» заполнились `UniqueId0`, `UniqueName`.
- [ ] ✍️ **T-BND-04** «Отвязать» → «Привязка удалена», поля очищены. **Снова привязать** (нужно для T-IMP).
## 5. Объекты — `T-OBJ`
- [ ] **T-OBJ-01** Большой проект: число объектов в тулбаре и дерево (названия, вложенность, счётчики детей) совпадают со старой страницей.
- [ ] **T-OBJ-02** «Развернуть» / «Свернуть», клик по строке раскрывает.
- [ ] **T-OBJ-03** Роль **Р** → нет «Добавить объект», нет меню ⋮, нет перетаскивания.
- [ ] ✍️ **T-OBJ-04** «ТЕСТ StroyBot», роль Е: пустое дерево → «Объекты не найдены» + кнопка. Добавить объект-пятно «Корпус 1».
- [ ] ✍️ **T-OBJ-05** Меню ⋮ у «Корпус 1» → «Добавить объект» → «Раздел» «Фундамент». У «Фундамент» → «Вид работ» «Бетонирование». У вида работ нет пункта «Добавить объект».
- [ ] ✍️ **T-OBJ-06** Пустое название → сообщение «Поле обязательно…»; Enter сохраняет.
- [ ] ✍️ **T-OBJ-07** Редактировать «Фундамент» → сменить родителя (нужен второй объект-пятно «Корпус 2»).
- [-] **T-OBJ-08** Перетаскивание — **убрано** (решение 2026-10-16). Проверить, что строку дерева мышкой больше не перетащить.
- [ ] ✍️ **T-OBJ-09** Удалить объект с детьми → подтверждение с числом детей; дети остаются (🐞 так было).
- [ ] **T-OBJ-10** «Экспорт» → скачался `objects-{id}.xlsx`, содержимое как у старой страницы.
- [ ] **T-OBJ-11** Меню ⋮ → «Работы» → открылся раздел «Работы» этого объекта.
## 6. Работы — `T-WRK`
- [ ] **T-WRK-01** Объект большого проекта: список работ, единицы, объёмы (3 знака), даты, вложенность — как в старой странице.
- [ ] **T-WRK-02** Родители свёрнуты; нумерация считает только видимые строки.
- [ ] ✍️ **T-WRK-03** «ТЕСТ StroyBot», «Бетонирование»: «Добавить работу» «Бетон В25», м3, 12.5, даты.
- [ ] ✍️ **T-WRK-04** «Сохранить и добавить еще» → окно не закрылось, поля пустые, родитель тот же.
- [ ] ✍️ **T-WRK-05** ⋮ → «Добавить дочернюю» → родитель предвыбран.
- [ ] ✍️ **T-WRK-06** «Редактировать» дочернюю → убрать родителя → сохранить → стала корневой.
- [ ] ✍️ **T-WRK-07** В списке «Родительская работа» при правке нет самой работы и её потомков.
- [ ] ✍️ **T-WRK-08** Удалить → «Подтвердите удаление» → исчезла.
- [ ] **T-WRK-09** Роль **Р** → нет кнопок добавления и меню ⋮.
## 7. Импорт работ — `T-IMP`
> ⛔ **T-IMP-02…07 заблокированы (2026-10-19):** сначала `GET https://api.tnsu.kz/Project/{oid}/works` отвечал 500 `42703: column l.name does not exist` — команда API исправила. Теперь он отвечает 200, но `totalCount: 0` у всех проектов: сметы в справочник ещё не загружены. Старый web part показывает то же «Работы не найдены». Повторить, когда появится хотя бы один проект со сметой (тестовый проект 51 привязать к нему; настоящие проекты не привязывать). T-IMP-01 ✅.
> Проверено по коду: API урезает `pageSize=200` до 100, но число страниц берётся из `totalPages` ответа — работы не теряются.
- [ ] **T-IMP-01** Проект без привязки к справочнику → «Проект не привязан к справочнику…».
- [ ] **T-IMP-02** Большой привязанный проект: «Загрузка работ… X из Y», затем число работ совпадает со старой страницей.
- [ ] **T-IMP-03** Поиск (код СНБ, объём, название), страницы по 100.
- [ ] ✍️ **T-IMP-04** «ТЕСТ StroyBot» (привязан в T-BND-04): выбрать объект → отметить 2 работы → «Импортировать» → тост «✓ Успешно импортировано: 2»; строки стали «✓ импортировано» и неактивны.
- [ ] ✍️ **T-IMP-05** Работы появились в разделе «Работы» этого объекта.
- [ ] ✍️ **T-IMP-06** «Импорт с созданием объекта» → в «Объекты» созданы объект и раздел из сметы, работы — под ними.
- [ ] **T-IMP-07** «Импортировать» без объекта → тост «Выберите объект…».
## 8. Отчёты по проекту — `T-RPL`
- [ ] **T-RPL-01** Большой проект, текущая неделя: число карточек, номера, даты, авторы, компании, объекты — как в старой странице.
- [ ] **T-RPL-02** Сменить период → «Применить» → совпадает со старой за тот же период.
- [ ] **T-RPL-03** Поиск по автору, компании, объекту, комментарию.
- [ ] **T-RPL-04** Роль **Н** → «Нет доступа».
- [ ] **T-RPL-05** Роль **Р** → нет «Отправить отчёт», копирования и удаления.
- [ ] **T-RPL-06** Клик по карточке → форма отчёта в **новой вкладке** с `reportId`.
## 9. Форма отчёта — `T-REP` (самое важное)
Роль **Е**, «ТЕСТ StroyBot», объекты и работы из T-OBJ / T-WRK.
- [ ] ✍️ **T-REP-01** «Отправить отчёт» → «Новый отчет», дата — сегодня, смена — первая.
- [ ] ✍️ **T-REP-02** «Сохранить» пустым → все 5 ошибок валидации, тексты как в старой форме.
- [ ] ✍️ **T-REP-03** Выбрать объект, компанию; «+ Выбрать работу» → работы объекта; drill-down по родителям; «Выбрать «X»».
- [ ] ✍️ **T-REP-04** У работы: значение 3.5, комментарий; «Персонал на работе» + профессия (2 чел., 8 ч); «Техника на работе» + техника.
- [ ] ✍️ **T-REP-05** Общий персонал с типом «Часы простоя» без комментария → ошибка валидации; с комментарием — ок.
- [ ] ✍️ **T-REP-06** Общая техника «Часы ремонта» + комментарий.
- [ ] ✍️ **T-REP-07** Добавить 2 фото → превью; удалить одно.
- [ ] ✍️ **T-REP-08** «Сохранить отчет» → «Отчет успешно сохранен!», кнопка стала «← Вернуться назад». Записать номер отчёта: `№ ____`.
- [ ] ✍️ **T-REP-09** Проверить в данных: отчёт в Dataverse; строки — работа, её персонал и техника **с родителем = строка работы**, общий персонал и техника **без родителя**; фото в `DocLib/{projectId}_{номер}`.
- [ ] ✍️ **T-REP-10** Открыть отчёт из «Отчёты по проекту» → режим правки, всё заполнено как сохраняли (включая персонал внутри работы).
- [ ] ✍️ **T-REP-11** Изменить значение работы, удалить общую технику → сохранить → открыть заново → изменения на месте, **лишних и задвоенных строк нет**.
- [ ] ✍️ **T-REP-12** Сменить объект в форме → работы очистились.
- [ ] ✍️ **T-REP-13** «Создать на основе» (копирование) → новая форма, всё скопировано, дата — сегодня, фото — пусто; сохранить → новый номер.
- [ ] ✍️ **T-REP-14** Пикер техники: группы, фильтр, «Все». Создать новую технику из пикера → появилась в списке «Техника».
- [ ] ✍️ **T-REP-15** Пикер работ: создать новую работу (ед., план, родитель) → появилась в «Работах» объекта.
- [ ] ✍️ **T-REP-16** Роль **У** → открыть неутверждённый отчёт → «На утверждении», поля только для чтения, «Утвердить отчет» → подтверждение → «Отчет утвержден!», бейдж «Утверждён».
- [ ] ✍️ **T-REP-17** Роль **Е** → утверждённый отчёт открывается только для чтения.
- [ ] **T-REP-18** Роль **Р** → отчёт только для чтения, кнопок нет.
- [ ] **T-REP-19** Роль **Н** → «Нет доступа» при открытии существующего отчёта.
- [ ] **T-REP-20** Большой проект: открыть 3 разных старых отчёта → всё совпадает со старой формой (план-факт, персонал, техника, фото-папка).
- Проверено на проекте 17: №2030 и ещё 2 отчёта совпали, режим правки тот же. Отчёт с персоналом/техникой **внутри работы** найти не удалось (прямого доступа к Dataverse нет) — вложенные строки проверены только на тестовом проекте (T-REP-10/11). Дополнительно: встретится такой отчёт — сверить со старой формой.
- [ ] **T-REP-21** «← Вернуться назад» → вернулись туда, откуда пришли.
- [ ] **T-REP-22** Enter в любом поле не перезагружает страницу.
- [ ] ✍️ **T-REP-23** Удалить тестовый отчёт из «Отчёты по проекту» → «Удалить отчёт?» → пропал из списка (мягкое удаление).
## 9a. Импорт отчёта из Excel — `T-RIM` (новая фича)
> `POST /Import/StroyBot/Reports?projectId=` **только проверяет** файл и ничего не пишет (проверено 2026-10-22: после ответа без ошибок в `cree9_reports` / `cree9_report_datas` записей нет). Отчёты пишет фронт по `ids` из ответа — тем же `saveReportWithData`, что форма «Отправить отчёт».
> Правила сборки: один отчёт = дата + компания + смена + объект (самый глубокий); каждая строка Excel — своя строка-работа; ресурс с «Часы работы» — под работу; простой / ремонт — отдельной строкой вне работы, «Комментарий (данные)» — ей. Вид работы сервер требует в каждой строке. ⚠️ Только проект **51**.
> Тестовый файл: `Downloads\ТЕСТ импорт отчета - проект 51 (v2).xlsx` (4 строки без ошибок → 2 отчёта, за 01.10 и 02.10; строка 4 — простой).
- [ ] **T-RIM-01** Меню: «Импорт отчёта из Excel» есть у роли **Е**; у **Р** (без edit0) — нет; по прямому адресу без прав — «Импорт отчётов недоступен…».
- [ ] **T-RIM-02** Выбор файла **сразу запускает проверку**: «Проверяем файл…», в F12 → Network один `POST Reports` (+ preflight). Кнопка выбора файла на время проверки неактивна.
- [ ] **T-RIM-03** Файл с ошибками → «С ошибками: N», «Исправьте ошибки в Excel и загрузите файл снова.», кнопки «Импортировать» нет.
- [ ] **T-RIM-04** Таблица: все 18 колонок файла; красные ячейки с ошибками; наведение — текст ошибки; справа «Ошибки»; фильтр «Только строки с ошибками».
- [ ] **T-RIM-05** Файл не .xlsx → «Нужен файл Excel в формате .xlsx», проверка не запускается.
- [ ] **T-RIM-06** v2 → «Ошибок нет — файл готов к импорту.», кнопка «Импортировать (отчётов: 2)» → окно «Будет создано отчётов: 2 в проекте «…»» → «Отмена» — ничего не записано.
- [ ] ✍️ **T-RIM-07** То же → «Импортировать» → «Сохраняем отчёты… 1 из 2» → «Импорт завершён. Созданы отчёты: №… за 01.10.2026, №… за 02.10.2026» и ссылка на «Отчёты по проекту»; кнопки больше нет. (Проверено 2026-10-22: №5, №6.)
- [ ] **T-RIM-08** Отчёт за 01.10 в форме: три работы «Арматура» (5, 3, 2); под первой техника «Бетонный насос» 1×11, под второй персонал «Бетонщик» 10×11; в «Технике» отдельно насос 1×3 «Часы простоя». За 02.10: «Арматура» 4, под ней «Бетонщик» 5×11.
## 9b. Импорт работ из Excel — `T-WIM` (новая фича)
> `POST /Import/StroyBot/Works?projectId=` **только проверяет** файл (как и импорт отчётов). Объекты должны уже быть в проекте — иначе ошибка «… не найден внутри …». В `ids` — id самого глубокого объекта и единицы; id работы сервер не возвращает.
> Пишет фронт теми же `createWork` / `updateWork`, что окно работы. Работа с тем же названием на объекте (без учёта регистра и пробелов, на любом уровне иерархии) — **обновляются только объём и единица**; иначе — создаётся работа верхнего уровня. Две одноимённые на объекте или одна работа дважды в файле — ошибка, ничего не пишется. ⚠️ Только проект **51**.
> Тестовый файл: `Downloads\ТЕСТ импорт работ - проект 51.xlsx` (Тестовый объект / Бетонирование: «Арматура» 120 м — есть, «Тестовая работа импорта» 50 м3 — новая).
- [ ] **T-WIM-01** Меню: «Импорт работ из Excel» после «Загрузить работы из сметы»; есть у роли **Е**, у **Р** (без edit0) — нет; в архивном проекте — нет; в завершённом — есть.
- [ ] **T-WIM-02** Файл с несуществующим объектом → «С ошибками: 1», «Объект 2: «…» не найден внутри «…»», кнопки «Импортировать» нет.
- [ ] **T-WIM-03** Тестовый файл → «Сверяем с работами объектов…» → «Будет создано работ: 1, обновлён … у существующих: 1», кнопка «Импортировать (работ: 2)».
- [ ] ✍️ **T-WIM-04** «Импортировать» → окно «… будет создано работ: 1, обновлено: 1» → «Сохраняем работы…» → «Импорт завершён: создано работ — 1, обновлено — 1» и ссылка «Открыть «Объекты»». (Проверено 2026-10-22.)
- [ ] **T-WIM-05** «Объекты» → «Бетонирование» → «Работы»: «Арматура» — 120 м, родитель «Бетон B25» и даты не изменились; «Тестовая работа импорта» — 50 м3, верхний уровень.
- [ ] ✍️ **T-WIM-06** Тот же файл ещё раз → «создано: 0, обновлено: 2» — работы не задваиваются. (Проверено 2026-10-22.)
- [ ] **T-WIM-07** Одна работа объекта дважды в файле → «Строки … и …: работа «…» на одном объекте указана дважды», кнопки нет.
## 10. Адаптивность — `T-RSP`
> Как: F12 → кнопка «телефон/планшет» (Ctrl+Shift+M) → сверху выбрать ширину → F5. Только просмотр, ничего не сохранять.
> Ширины: **360** (обычный телефон), **768** (планшет), **1280** (ноутбук), плюс твой монитор как есть. На каждой ширине — признаки бага:
> горизонтальная прокрутка всей страницы, текст/кнопка вылезает за край, элементы налезают друг на друга, что-то нельзя нажать.
- [ ] **T-RSP-01** 360: меню скрыто, кнопка ☰ открывает его поверх, выбор раздела закрывает меню.
- [ ] **T-RSP-02** 360: главная — выбор проекта, даты в столбик, карточки в одну колонку.
- [ ] **T-RSP-03** 360: «Отчёты по проекту» — фильтр дат над поиском, карточки в одну колонку, кнопки копирования/удаления нажимаются.
- [ ] **T-RSP-04** 360: форма отчёта — поля во всю ширину, «Кол-во/Часы» друг под другом, пикер — шторка снизу, список прокручивается, «Сохранить» видна.
- [ ] **T-RSP-05** 360: «Объекты» и «Работы» — дерево не уезжает вправо, длинные названия переносятся/обрезаются, меню ⋮ не уходит за экран.
- [ ] **T-RSP-06** 360: «Ресурсы», «Привязка», «Импорт» — колонки складываются, модалки помещаются в экран.
- [ ] **T-RSP-07** 768: все разделы — то же беглым просмотром; пикер отчёта — окно по центру.
- [ ] **T-RSP-08** 1280 и свой монитор: меню слева, ничего не растянуто на всю ширину неудобно, форма отчёта — узкая колонка.
- [ ] **T-RSP-09** После деплоя: открыть страницу на **настоящем телефоне** (браузер и приложение SharePoint) — меню, форма отчёта, пикер (сохранять только на тестовом проекте 51).
---
## Как сообщить о баге
Скопируй и заполни:
```
Баг: T-XXX-NN
Роль / проект: Е / ТЕСТ StroyBot
Что сделал: 1) … 2) … 3) …
Ожидал: …
Получил: …
Старая страница в этом случае: … (если сравнивал)
Console (F12): текст красной ошибки
Network (F12): красный запрос — адрес и ответ (вкладка Response)
Скриншот: (если про внешний вид)
```
---
## Итог
| Раздел | Пройдено | Багов |
|---|---|---|
| Оболочка | | |
| Главная | | |
| Ресурсы | | |
| Привязка | | |
| Объекты | | |
| Работы | | |
| Импорт | | |
| Отчёты по проекту | | |
| Форма отчёта | | |