Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.7 KiB
5.7 KiB
Доработки сервера для iOS «FM Склад» — прогресс
Автономная задача владельца (08.10.2026). Приложение (SwiftUI) на Маке владельца использует API стенда; серверу не хватает ряда возможностей. Стенд — не трогаем прод.
План (пункты владельца)
/api/inventory/stock?groupId=— фильтр по группе с вложенными подгруппами (через денормализованныйProductGroup.Path, helperDescendantGroupIdsAsync).- POST
/api/catalog/products/{id}/barcodes{code, kind} — добавление штрихкода, уникальность в орг ((OrganizationId,Code)), 409 «штрихкод уже у товара X» + название, идемпотентно при повторе тому же товару, 400 на пустой, автоопределение типа по длине. /api/me→permissions(эффективные флагиRolePermissionsс учётом роли и простого/расширенного режима; единый источникRolePermissions.Effective). Веб — хукuseCan()на том же источнике (раньше гейтил по именам ролей/advancedMode).- Офлайн-каталог (
ProductSyncDto): добавлен явныйisWeighed(+ уже былиpackaging,unitCode). - Весовые этикетки: настройки организации (
WeightBarcode*: enabled/префиксы веса/ префиксы цены/длина кода), миграция Phase35; парсер вынесен вfood-market.shared/Barcodes/WeightedBarcode(кассы pos.core делегирует туда);by-barcodeразбирает весовую этикетку → товар + количество (вес) / встроенная цена.GET/PUT /api/organization/settingsотдаёт/принимает настройки (round-trip-safe). - Тесты: 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(естьPackaging1/2/3 +UnitCode), нужен явныйIsWeighed. - Весовой парсер уже есть в
pos.core/Logic/BarcodeParser.cs(префикс 20–24 вес, 25–29 цена) — вынести вfood-market.shared, сделать настраиваемым, использовать и на сервере, и в кассе. - Миграции — ручные Phase-файлы (raw SQL, IF NOT EXISTS) с
[DbContext]+[Migration].
Итог
Все 6 пунктов выполнены. Тесты зелёные: 10 unit (WeightedBarcode + RolePermissions.Effective)
- 4 integration (группа/штрихкод/me-права/весовая этикетка) + регресс POS 9/9. Задеплоено на
стенд (
~/deploy-stage.sh): guard isolation OK, api+web собраны/запушены, stage-api Healthy, миграция Phase35 применена (4 колонкиWeightBarcode*вorganizationsна stage-БД проверены), https://test.admin.food-market.kz OK. Прод/shared-postgres/global.json/gateway/sklad — не трогали.
Для мобильного клиента см. docs/mobile-api.md.
Коммиты
5173eaafeat(catalog): штрихкоды товара — добавление + весовые этикетки7231c83feat(inventory): фильтр остатков по группе товаров с вложенными2a4ba14feat(auth): эффективные права пользователя в /api/me (единый источник)1400106test(mobile-api): unit + integration доработок для «FM Склад»ad812eedocs(mobile-api): описание API для мобильного клиента + прогресс
Журнал
- 08.10 — старт; изучена база; план зафиксирован.
- 08.10 — реализованы все 6 пунктов; 14 новых тестов зелёные; деплой на стенд, миграция применена.