food-market/docs/mobile-api-progress.md
nns ad812ee2b5
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
docs(mobile-api): описание API для мобильного клиента + прогресс
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 05:39:37 +05:00

46 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Доработки сервера для iOS «FM Склад» — прогресс
Автономная задача владельца (08.10.2026). Приложение (SwiftUI) на Маке владельца
использует API стенда; серверу не хватает ряда возможностей. Стенд — не трогаем прод.
## План (пункты владельца)
1. [x] `/api/inventory/stock?groupId=` — фильтр по группе с вложенными подгруппами
(через денормализованный `ProductGroup.Path`, helper `DescendantGroupIdsAsync`).
2. [x] POST `/api/catalog/products/{id}/barcodes` {code, kind} — добавление штрихкода,
уникальность в орг (`(OrganizationId,Code)`), 409 «штрихкод уже у товара X» + название,
идемпотентно при повторе тому же товару, 400 на пустой, автоопределение типа по длине.
3. [x] `/api/me` → `permissions` (эффективные флаги `RolePermissions` с учётом роли и
простого/расширенного режима; единый источник `RolePermissions.Effective`). Веб —
хук `useCan()` на том же источнике (раньше гейтил по именам ролей/advancedMode).
4. [x] Офлайн-каталог (`ProductSyncDto`): добавлен явный `isWeighed` (+ уже были `packaging`,
`unitCode`).
5. [x] Весовые этикетки: настройки организации (`WeightBarcode*`: enabled/префиксы веса/
префиксы цены/длина кода), миграция Phase35; парсер вынесен в
`food-market.shared/Barcodes/WeightedBarcode` (кассы pos.core делегирует туда);
`by-barcode` разбирает весовую этикетку → товар + количество (вес) / встроенная цена.
`GET/PUT /api/organization/settings` отдаёт/принимает настройки (round-trip-safe).
6. [x] Тесты: unit 10 (WeightedBarcode + RolePermissions.Effective) + 4 integration
(группа/штрихкод/me-права/весовая этикетка); `docs/mobile-api.md`. Деплой на стенд — см. ниже.
НЕ трогать: прод, shared-postgres, global.json, gateway nginx, sklad. — соблюдено.
## Изученная база
- `/api/inventory/stock` — `StockController.GetStock` (storeId/productId/search/includeZero/
page/sort). Группы: `ProductGroup` иерархична, есть денормализованный `Path`
(«Родитель/Дочь/Внук») → фильтр по вложенным через префикс Path.
- Штрихкоды: `ProductBarcode(Code, Type:BarcodeType, IsPrimary)`, уникальный индекс
`(OrganizationId, Code)`. Поиск — `GET /api/catalog/products/by-barcode/{value}` и `quick-search`.
- `/api/me` — minimal-endpoint в `Program.cs`: sub/name/email/roles/orgId/hasLiveOrg/
hasActiveEmployee/advancedMode. Прав (RolePermissions) НЕ отдаёт.
- Права: `RolePermissions` (флаги) на роль сотрудника; `PermissionAuthorizationHandler`
(SuperAdmin/Admin → все; иначе роль активного Employee). `RequiresAdvancedMode` гейтит
модули Demands/Transfers/Loyalty/Promotions/PriceTypes/ABC/Audit/Telegram/Presets.
Веб гейтит по именам ролей + `advancedMode` (дублирование — свести к единому источнику).
- POS-синк каталога: `ProductSyncDto` (есть `Packaging` 1/2/3 + `UnitCode`), нужен явный `IsWeighed`.
- Весовой парсер уже есть в `pos.core/Logic/BarcodeParser.cs` (префикс 20–24 вес, 25–29 цена) —
вынести в `food-market.shared`, сделать настраиваемым, использовать и на сервере, и в кассе.
- Миграции — ручные Phase-файлы (raw SQL, IF NOT EXISTS) с `[DbContext]`+`[Migration]`.
## Журнал
- 08.10 — старт; изучена база; план зафиксирован.