Skip to content

[Security] Состав заказа в финальном статусе можно менять любому менеджеру с msorder_save #801

Description

@biz87

Проблема

Состав заказа в финальном статусе («Отправлен», «Отменён» — final = 1) можно менять из менеджера, и право на это есть у любого, у кого есть msorder_save.

В ManagerOrderProductsService проверка финального статуса есть только в addProduct() (ManagerOrderProductsService.php:80). В updateProduct() и deleteProduct() её нет, поэтому у закрытого заказа можно:

  • поменять количество и цену позиции — пересчитываются cart_cost и cost уже отправленного или отменённого заказа;
  • удалить позицию.

Все три маршрута (POST|PUT|DELETE /api/mgr/orders/{id}/products..., config/routes/manager.php:895-907) закрыты одним правом msorder_save. Политика miniShopManagerPolicy выдаёт его вместе со всеми правами MS3, то есть сейчас это может любой менеджер магазина.

Интерфейс (OrderProductsTab.vue) финальный статус не учитывает: кнопки редактирования и удаления видны всегда.

Ожидаемое поведение

Полный запрет не нужен: исправление закрытого заказа — законный сценарий для администратора (ошибка при отгрузке, корректировка для бухгалтерии). Но менеджеру с ограниченными правами это делать нельзя.

Предложение:

  1. Новое право — например, msorder_edit_final («Разрешает изменять состав заказа в финальном статусе»).
    • Добавить его в miniShopManagerPolicyTemplate, но не выдавать в miniShopManagerPolicy (false в data), чтобы обычный менеджер его не получил.
    • Пользователь sudo получает право автоматически. Для прочих администраторов его выдают явной политикой.
    • Лексикон permissions — ru/en.
  2. Единая проверка в сервисе для addProduct / updateProduct / deleteProduct: если статус заказа final и у пользователя нет msorder_edit_final, возвращать 403 (не 400, как сейчас в addProduct) с понятным сообщением из лексикона.
  3. UI: в OrderProductsTab.vue для финального заказа без права прятать или блокировать добавление, редактирование и удаление позиций. Причину показать подсказкой. Проверка на сервере остаётся главной, UI только отражает её.
  4. Правку закрытого заказа пишем в лог заказа (OrderLog) отдельной записью, чтобы было видно, кто и что изменил после закрытия.

Открытые вопросы

  • Распространять ли право на правку остальных полей заказа (адрес, стоимость доставки и т. п.), или только на состав? Нужно проверить, есть ли проверка final на PUT /orders/{id}.
  • Связь со складским учётом: правка состава заказа из админки сейчас вообще не трогает резерв в ms3_inventory_reservations — это отдельная проблема, будет отдельный issue. Для закрытого заказа складская корректировка при правке состава, видимо, не нужна (остаток уже списан или возвращён), но это стоит зафиксировать явно.

Файлы

  • core/components/minishop3/src/Services/Order/ManagerOrderProductsService.php
  • core/components/minishop3/config/manager_access_policy.php, _build/elements/policyTemplates.php
  • core/components/minishop3/lexicon/{ru,en}/permissions.inc.php
  • vueManager/src/components/order/OrderProductsTab.vue
  • для существующих установок — резолвер или миграция, которая добавит право в шаблон политики

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingphpPull requests that update php codepriority: mediumСредний приоритет

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions