Перейти к содержанию

Заметки

Две независимые сущности внутри кабинета посредника (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)
  • Неизвестный type404. Пустой body → удаление записи.
  • Изоляция по посредникам: запрос всегда скоупится agent_id авторизованного сотрудника — чужие заметки недоступны.
  • Каскады: удаление посредника → заметки удаляются; удаление сотрудника → заметка остаётся, staff_id обнуляется.

Права ПДИУ не применяются

Заметки сейчас доступны любому сотруднику посредника независимо от прав (AgentStaff::hasPermission не проверяется). Если по бизнес-логике заметки должны гейтиться правами (напр., ограниченный сотрудник не видит заметки на чужих заказах) — это доработка, а не текущее поведение.

Тест-чек-лист

Позитив

  • Заметка на заказе: создать → иконка зелёная; перезагрузка страницы → заметка на месте.
  • Повторное открытие — тот же текст; правка → сохранить → hover-превью показывает новый текст.
  • Очистка текста → сохранить → иконка серая, заметки нет.
  • По каждому типу (товар, группа, отгрузка, груз, клиент) — зелёная иконка и превью.
  • Блокнот: ввод → «сохранение…» → «сохранено»; переход/перезагрузка → текст на месте.
  • Свернуть/развернуть блокнот, перезагрузить → состояние сохранилось.

Общая / раздельная видимость

  • Сотрудник A создал заметку на заказе → сотрудник B того же посредника видит ту же.
  • Личный блокнот A не виден B (у B свой/пустой).
  • Под другим посредником заметок первого не видно (изоляция).

Негатив / границы

  • Клиенту заметки недоступны и не видны.
  • Текст сверх лимита: > 10 000 (объект) / > 50 000 (блокнот) — валидация (422) без падения.
  • Текст из одних пробелов → трактуется как «нет заметки».
  • Заказ с десятками товаров — иконки/флаги грузятся без лагов.
  • Спецсимволы, эмодзи, переносы строк — сохраняются, корректно в превью, без HTML-инъекций.
  • Печать заказа — блокнот скрыт, объектные иконки не ломают печатную форму.

Не путать с комментарием к товару

order_items.comment (комментарий к товару, виден в расчёте) — другое поле. Заметки — отдельная внутренняя сущность.