Заметки¶
Две независимые сущности внутри кабинета посредника (guard agent):
- Заметки по объектам — короткие внутренние заметки, привязанные к объекту (заказ, товар, группа выкупа, отгрузка, груз, клиент). Рядом с объектом — иконка: серая — нет, зелёная — есть. Общие для всех сотрудников одного посредника.
- Личный блокнот сотрудника — плавающая панель справа-внизу, своя у каждого сотрудника, с автосохранением.
Хранится в одной таблице notes; сервис App\Services\NotesService, контроллер Agent\NotesController (JSON). Клиенту заметки не видны и в его данные не попадают.
Заметки по объектам¶
Компонент Components/NoteIcon.vue. Типы (NotesService::TYPES без personal) и точки размещения:
| Тип | Где стоит иконка |
|---|---|
order |
шапка карточки заказа (Orders/Show) |
item |
у каждого товара в заказе (два режима отображения) |
group |
шапка группы выкупа (площадка/магазин) внутри заказа |
shipment |
заголовок страницы отгрузки (Shipments/Show) |
delivery |
заголовок страницы груза (Deliveries/Show) |
client |
шапка карточки клиента (Clients/Show) |
Поведение иконки:
- Серая (
text-gray-300) — заметки нет; зелёная (text-emerald-500) — есть непустая. - Наведение — превью текста (тултип; переносы строк сохраняются; тело подгружается лениво).
- Клик — модалка-редактор (поле ввода + «Отмена»/«Сохранить»).
- Сохранение непустого текста → заметка создаётся/обновляется, иконка зеленеет.
- Сохранение пустого/из одних пробелов → заметка удаляется (иконка сереет).
- На объект — одна заметка (
unique(agent_id, notable_type, notable_id)), лимит 10 000 символов.
Общие для сотрудников
Объектная заметка привязана к agent_id, а не к сотруднику: создал один — видят и правят все сотрудники этого посредника. В staff_id пишется последний редактор (на UI не показывается).
На странице заказа наличие заметок у товаров и групп приходит батч-флагами (NotesService::flags в OrdersController::presentOrder) — иконки сразу зелёные без дополнительных запросов.
Личный блокнот сотрудника¶
Компонент Components/StaffNotepad.vue, смонтирован в Layouts/AgentLayout.vue → присутствует на всех страницах кабинета посредника.
- Жёлтая круглая кнопка справа-внизу; клик — разворачивает панель (≈60 % высоты экрана, до 420 px), крестик/повторный клик — сворачивает.
- Состояние «развёрнут/свёрнут» запоминается в
localStorage(notepad_open). - Автосохранение через ~0,7 c после остановки ввода; индикатор «сохранение…» → «сохранено».
- Своя у каждого сотрудника (
notable_type='personal',notable_id = staff_id); коллеги не видят. - Лимит 50 000 символов; при печати (
print:) блокнот скрыт.
Данные и API¶
Таблица notes: agent_id (FK agents, cascade), staff_id (FK agent_staff, nullOnDelete — владелец личной / последний редактор), notable_type (order|item|group|shipment|delivery|client|personal), notable_id, body, timestamps. Уникальность (agent_id, notable_type, notable_id).
Маршруты (routes/agent.php, guard agent):
| Метод | URL | Назначение |
|---|---|---|
| GET | /agent/notes/{type}/{id} |
тело заметки объекта |
| POST | /agent/notes/{type}/{id} |
сохранить/очистить (body ≤ 10000) |
| GET | /agent/notes/personal |
личный блокнот |
| POST | /agent/notes/personal |
сохранить блокнот (body ≤ 50000) |
- Неизвестный
type→ 404. Пустойbody→ удаление записи. - Изоляция по посредникам: запрос всегда скоупится
agent_idавторизованного сотрудника — чужие заметки недоступны. - Каскады: удаление посредника → заметки удаляются; удаление сотрудника → заметка остаётся,
staff_idобнуляется.
Права ПДИУ не применяются
Заметки сейчас доступны любому сотруднику посредника независимо от прав (AgentStaff::hasPermission не проверяется). Если по бизнес-логике заметки должны гейтиться правами (напр., ограниченный сотрудник не видит заметки на чужих заказах) — это доработка, а не текущее поведение.
Тест-чек-лист¶
Позитив
- Заметка на заказе: создать → иконка зелёная; перезагрузка страницы → заметка на месте.
- Повторное открытие — тот же текст; правка → сохранить → hover-превью показывает новый текст.
- Очистка текста → сохранить → иконка серая, заметки нет.
- По каждому типу (товар, группа, отгрузка, груз, клиент) — зелёная иконка и превью.
- Блокнот: ввод → «сохранение…» → «сохранено»; переход/перезагрузка → текст на месте.
- Свернуть/развернуть блокнот, перезагрузить → состояние сохранилось.
Общая / раздельная видимость
- Сотрудник A создал заметку на заказе → сотрудник B того же посредника видит ту же.
- Личный блокнот A не виден B (у B свой/пустой).
- Под другим посредником заметок первого не видно (изоляция).
Негатив / границы
- Клиенту заметки недоступны и не видны.
- Текст сверх лимита: > 10 000 (объект) / > 50 000 (блокнот) — валидация (422) без падения.
- Текст из одних пробелов → трактуется как «нет заметки».
- Заказ с десятками товаров — иконки/флаги грузятся без лагов.
- Спецсимволы, эмодзи, переносы строк — сохраняются, корректно в превью, без HTML-инъекций.
- Печать заказа — блокнот скрыт, объектные иконки не ломают печатную форму.
Не путать с комментарием к товару
order_items.comment (комментарий к товару, виден в расчёте) — другое поле. Заметки — отдельная внутренняя сущность.