Проблема
Состав заказа в финальном статусе («Отправлен», «Отменён» — 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) финальный статус не учитывает: кнопки редактирования и удаления видны всегда.
Ожидаемое поведение
Полный запрет не нужен: исправление закрытого заказа — законный сценарий для администратора (ошибка при отгрузке, корректировка для бухгалтерии). Но менеджеру с ограниченными правами это делать нельзя.
Предложение:
- Новое право — например,
msorder_edit_final («Разрешает изменять состав заказа в финальном статусе»).
- Добавить его в
miniShopManagerPolicyTemplate, но не выдавать в miniShopManagerPolicy (false в data), чтобы обычный менеджер его не получил.
- Пользователь sudo получает право автоматически. Для прочих администраторов его выдают явной политикой.
- Лексикон
permissions — ru/en.
- Единая проверка в сервисе для
addProduct / updateProduct / deleteProduct: если статус заказа final и у пользователя нет msorder_edit_final, возвращать 403 (не 400, как сейчас в addProduct) с понятным сообщением из лексикона.
- UI: в
OrderProductsTab.vue для финального заказа без права прятать или блокировать добавление, редактирование и удаление позиций. Причину показать подсказкой. Проверка на сервере остаётся главной, UI только отражает её.
- Правку закрытого заказа пишем в лог заказа (
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
- для существующих установок — резолвер или миграция, которая добавит право в шаблон политики
Проблема
Состав заказа в финальном статусе («Отправлен», «Отменён» —
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) финальный статус не учитывает: кнопки редактирования и удаления видны всегда.Ожидаемое поведение
Полный запрет не нужен: исправление закрытого заказа — законный сценарий для администратора (ошибка при отгрузке, корректировка для бухгалтерии). Но менеджеру с ограниченными правами это делать нельзя.
Предложение:
msorder_edit_final(«Разрешает изменять состав заказа в финальном статусе»).miniShopManagerPolicyTemplate, но не выдавать вminiShopManagerPolicy(falseвdata), чтобы обычный менеджер его не получил.permissions— ru/en.addProduct/updateProduct/deleteProduct: если статус заказаfinalи у пользователя нетmsorder_edit_final, возвращать 403 (не 400, как сейчас вaddProduct) с понятным сообщением из лексикона.OrderProductsTab.vueдля финального заказа без права прятать или блокировать добавление, редактирование и удаление позиций. Причину показать подсказкой. Проверка на сервере остаётся главной, UI только отражает её.OrderLog) отдельной записью, чтобы было видно, кто и что изменил после закрытия.Открытые вопросы
finalнаPUT /orders/{id}.ms3_inventory_reservations— это отдельная проблема, будет отдельный issue. Для закрытого заказа складская корректировка при правке состава, видимо, не нужна (остаток уже списан или возвращён), но это стоит зафиксировать явно.Файлы
core/components/minishop3/src/Services/Order/ManagerOrderProductsService.phpcore/components/minishop3/config/manager_access_policy.php,_build/elements/policyTemplates.phpcore/components/minishop3/lexicon/{ru,en}/permissions.inc.phpvueManager/src/components/order/OrderProductsTab.vue