From 0f6efacf11423c0bd529e2441daa306a755ae1b8 Mon Sep 17 00:00:00 2001 From: abounoone Date: Fri, 20 Mar 2026 03:23:48 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20add=20=D0=9C=D0=BE=D0=B9=D0=A1=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=20orders=20sync=20design=20spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-03-20-moysklad-orders-sync-design.md | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/superpowers/specs/2026-03-20-moysklad-orders-sync-design.md diff --git a/docs/superpowers/specs/2026-03-20-moysklad-orders-sync-design.md b/docs/superpowers/specs/2026-03-20-moysklad-orders-sync-design.md new file mode 100644 index 00000000..046be8e4 --- /dev/null +++ b/docs/superpowers/specs/2026-03-20-moysklad-orders-sync-design.md @@ -0,0 +1,66 @@ +# МойСклад: синхронизация заказов покупателей + +**Дата:** 2026-03-20 +**Приложение:** `picking_app` + +## Цель + +Расширить существующую интеграцию с МойСкладом: добавить синхронизацию заказов покупателей (customerorder) в очередь комплектации наравне с перемещениями (move). + +## Контекст + +В `picking_app` уже реализована синхронизация перемещений (`sync_picking_list()`), хранение токена в `Picking Settings`, пагинация через `nextHref`. Заказы должны попасть в ту же очередь с минимальными изменениями в UI и логике комплектации. + +## Модель данных + +### Picking Settings — новое поле +| Поле | Тип | Значение по умолчанию | +|------|-----|----------------------| +| `ms_order_state` | Data | `"Подтверждён"` | + +### Picking List — новое поле +| Поле | Тип | Значение | +|------|-----|---------| +| `source_type` | Select | `"Move"` / `"Order"` | + +Для существующих записей `source_type` не проставляется (остаётся пустым — UI трактует как Move). + +## Логика синхронизации + +### `sync_picking_orders()` +1. Читает `ms_order_state` из `Picking Settings` (fallback: `"Подтверждён"`) +2. Тянет `customerorder` из МС: + ``` + GET /entity/customerorder + expand=state,positions.assortment,positions.assortment.uom + limit=100 + order=moment,desc + ``` +3. Фильтрует на клиенте: `order["state"]["name"] == ms_order_state` +4. `to_warehouse` берётся из `store` объекта заказа (склад отгрузки); `from_warehouse` — пустой +5. Создаёт/обновляет `Picking List` с `source_type = "Order"` по той же логике что `sync_picking_list()` + +### `sync_all()` — новая публичная функция (`@frappe.whitelist`) +Вызывает последовательно `sync_picking_list()` и `sync_picking_orders()`, возвращает суммарный результат: +```json +{"status": "ok", "moves": {"created": N, "updated": N}, "orders": {"created": N, "updated": N}} +``` + +Существующая `sync_picking_list()` при создании новых записей проставляет `source_type = "Move"`. + +## UI + +В попап-диалоге выбора позиций: +- Добавить колонку **Тип** (`source_type`): отображает "Перемещение" / "Заказ" +- Добавить фильтр по типу: табы или кнопки **Все / Перемещения / Заказы** +- Логика добавления позиций в `Picking Document` — без изменений + +## Что не меняется +- Структура `Picking List Item` +- Логика `add_items_from_picking_list()` +- Логика `get_picking_list_items()` — добавить опциональный параметр `source_type` для фильтрации +- Статусная машина Picking List (Draft → Partial → Added) + +## Ограничения +- Фильтрация по статусу происходит на стороне клиента (МС API не поддерживает фильтр по `state.name` напрямую через query params без знания UUID состояния) +- `from_warehouse` у заказов не заполняется