food-market/docs/api-reference.md
nns ed140cb819
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
docs(s28): api-reference 195→240 + observability + integration #7 + CI
Overnight progress while 4h-soak runs in background:

1. ApiReferenceDocsJob.cs + scripts/gen-api-reference.py — return-type
   regex теперь ловит nested generics любой глубины. Было 195
   endpoint'ов в auto-gen reference; стало 240 (+45). EmployeesController
   GET /api/organization/employees был пропущен из-за
   Task<ActionResult<PagedResult<EmployeeDto>>>.

2. docs/observability.md — добавлен food_market_disk_free_bytes (Sprint 20)
   + раздел "quality-watchdog метрики" (5 метрик textfile exporter'a из
   Sprint 26: run_total, step_failure_total, endpoint_p95_ms,
   last_run_status, incidents_total). Готовые dashboards теперь содержат
   оба JSON (food-market.json + quality-watchdog.json).

3. tests/integration/07-import-export-flows.spec.ts — POST 1C-CSV import
   (semicolon-CSV cp1251) → создаются продукты с группой автоматом;
   POST /api/org/export (НЕ /api/admin/org-export) → возвращает
   {id, status}; orgB не видит export orgA. Прогон 8.2s.

4. tests/food-market.IntegrationTests/PruneQualityTestOrgsTests.cs —
   2 [Fact]'a для метода из Sprint 25. Удаляет только quality-* старше
   threshold, не трогает реальные org. Требует Testcontainers.

5. .forgejo/workflows/regression.yml — добавлен шаг integration suite
   после flows+visual. Telegram: "35 flows + 60 visual + 8 integration".

Soak-real (4h @ 50 RPS) запущен в setsid-detach session, продолжается.
Итоговые числа добавлю в sprint28-progress.md после завершения.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-09 03:26:39 +05:00

599 lines
25 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.

# API endpoint reference
Сгенерировано Python-сканером (`scripts/gen-api-reference.py`) из `src/food-market.api/Controllers/`.
Sprint 28 версия: ловит endpoint'ы с nested generic return-типами.
Идентичный логике runtime-job `ApiReferenceDocsJob` (Sprint 24); тот пересоздаёт файл
еженедельно при cron `Hangfire:Cron:ApiReferenceDocs`.
Всего endpoint'ов: **240**.
Контроллеров: **58**.
Полная OpenAPI-спека: `/swagger/v1/swagger.json`. Этот reference — human-readable summary.
## `AbcReportController`
Base route: `/api/reports/abc`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/abc` | — | |
| GET | `/api/reports/abc/export` | — | |
## `AdminCleanupController`
Base route: `/api/admin/cleanup`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/admin/cleanup/all` | — | Полная очистка данных текущей организации — всё кроме настроек: остаются Organization, пользователи,… |
| DELETE | `/api/admin/cleanup/counterparties` | — | Удалить всех контрагентов текущей организации. Чтобы не нарваться на FK, сначала обнуляем ссылки (Pr… |
| GET | `/api/admin/cleanup/stats` | — | |
| POST | `/api/admin/cleanup/all/async` | — | |
## `AdminJobsController`
Base route: `/api/admin/jobs`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/jobs/recent` | — | |
| GET | `/api/admin/jobs/{id:guid}` | — | |
## `AuthForgotPasswordController`
Base route: `/api/auth`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/auth/forgot-password` | — | |
| POST | `/api/auth/reset-password` | — | |
## `AuthSignupController`
Base route: `/api/auth`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/auth/signup` | — | |
## `AuthorizationController`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/~/connect/token` | — | |
## `CounterpartiesController`
Base route: `/api/catalog/counterparties`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/counterparties/{id:guid}` | — | |
| GET | `/api/catalog/counterparties` | — | |
| GET | `/api/catalog/counterparties/export` | — | Sprint 19: экспорт списка контрагентов. |
| GET | `/api/catalog/counterparties/{id:guid}` | — | |
| POST | `/api/catalog/counterparties` | — | |
| PUT | `/api/catalog/counterparties/{id:guid}` | — | |
## `CountriesController`
Base route: `/api/catalog/countries`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/countries/{id:guid}` | — | |
| GET | `/api/catalog/countries` | — | |
| GET | `/api/catalog/countries/{id:guid}` | — | |
| POST | `/api/catalog/countries` | — | |
| PUT | `/api/catalog/countries/{id:guid}` | — | |
## `CurrenciesController`
Base route: `/api/catalog/currencies`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/catalog/currencies` | — | |
| GET | `/api/catalog/currencies/{id:guid}` | — | |
| POST | `/api/catalog/currencies` | — | |
| PUT | `/api/catalog/currencies/{id:guid}` | — | |
## `DashboardController`
Base route: `/api/dashboard`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/dashboard/low-stock` | — | Список товаров с остатком ≤ MinStock (Product.MinStock задан). Сортировка: меньший «запас в днях» → … |
| GET | `/api/dashboard/margin` | — | Маржа за окно N дней: выручка минус COGS (Sum(qty * UnitCost) по строкам проданных товаров). Использ… |
| GET | `/api/dashboard/recent-sales` | — | Последние N проведённых чеков (включая возвраты). Дашборд рендерит их как live-feed: SignalR SalePos… |
| GET | `/api/dashboard/top-products` | — | Top-N товаров по выручке за окно последних N дней. Default: 7 дней, top-5. Только проведённые чеки (… |
## `DemandsController`
Base route: `/api/sales/demands`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/sales/demands/{id:guid}` | — | |
| GET | `/api/sales/demands` | — | |
| GET | `/api/sales/demands/{id:guid}` | — | |
| POST | `/api/sales/demands` | — | |
| POST | `/api/sales/demands/{id:guid}/post` | — | |
| POST | `/api/sales/demands/{id:guid}/unpost` | — | |
| PUT | `/api/sales/demands/{id:guid}` | — | |
## `DemoSeedController`
Base route: `/api/admin/seed-demo`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/seed-demo/status` | — | Сводка: какие демо-сущности уже наполнены. Дешёвый — только count'ы, не вызывает seed. UI использует… |
| POST | `/api/admin/seed-demo` | — | Запустить seed демо-данных. Идемпотентен — если уже наполнено, возвращает existing summary без встав… |
## `DiagnosticController`
Base route: `/api/admin/diagnostic`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/diagnostic/run` | — | |
## `EmployeeRolesController`
Base route: `/api/organization/employee-roles`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/organization/employee-roles/{id:guid}` | — | |
| GET | `/api/organization/employee-roles` | — | |
| GET | `/api/organization/employee-roles/{id:guid}` | — | |
| POST | `/api/organization/employee-roles` | — | |
| PUT | `/api/organization/employee-roles/{id:guid}` | — | |
## `EmployeesController`
Base route: `/api/organization/employees`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/organization/employees/{id:guid}` | — | |
| GET | `/api/organization/employees` | — | |
| GET | `/api/organization/employees/{id:guid}` | — | |
| POST | `/api/organization/employees` | — | |
| PUT | `/api/organization/employees/{id:guid}` | — | |
## `EntersController`
Base route: `/api/inventory/enters`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/enters/{id:guid}` | — | |
| GET | `/api/inventory/enters` | — | |
| GET | `/api/inventory/enters/{id:guid}` | — | |
| POST | `/api/inventory/enters` | — | |
| POST | `/api/inventory/enters/{id:guid}/post` | — | |
| POST | `/api/inventory/enters/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/enters/{id:guid}` | — | |
## `ExternalAuthController`
Base route: `/api/auth/external`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/auth/external/callback` | — | Callback после успешного OAuth у провайдера. Читает claims и решает, что делать: связать с существую… |
| GET | `/api/auth/external/providers` | — | Список доступных SSO-провайдеров. Web-фронт по этому списку решает, какие кнопки рисовать на /login. |
| GET | `/api/auth/external/{provider}` | — | Инициирует OAuth challenge на провайдере. Если провайдер не сконфигурирован — 503 с подсказкой. |
## `FeedbackController`
Base route: `/api/feedback`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/feedback` | — | |
## `GlobalSearchController`
Base route: `/api/search`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/search/global` | — | |
## `InventoriesController`
Base route: `/api/inventory/inventories`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/inventories/{id:guid}` | — | |
| GET | `/api/inventory/inventories` | — | |
| GET | `/api/inventory/inventories/{id:guid}` | — | |
| POST | `/api/inventory/inventories` | — | |
| POST | `/api/inventory/inventories/{id:guid}/post` | — | |
| POST | `/api/inventory/inventories/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/inventories/{id:guid}` | — | |
## `LossesController`
Base route: `/api/inventory/losses`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/losses/{id:guid}` | — | |
| GET | `/api/inventory/losses` | — | |
| GET | `/api/inventory/losses/{id:guid}` | — | |
| POST | `/api/inventory/losses` | — | |
| POST | `/api/inventory/losses/{id:guid}/post` | — | |
| POST | `/api/inventory/losses/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/losses/{id:guid}` | — | |
## `LoyaltyCardsController`
Base route: `/api/loyalty/cards`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/loyalty/cards/{id:guid}` | — | |
| GET | `/api/loyalty/cards` | — | |
| GET | `/api/loyalty/cards/lookup` | — | Lookup по CardNumber — используется кассой при оплате. Возвращает 404 если карты нет, 409 если карта… |
| POST | `/api/loyalty/cards/issue` | — | |
| POST | `/api/loyalty/cards/{id:guid}/block` | — | |
| POST | `/api/loyalty/cards/{id:guid}/unblock` | — | |
## `LoyaltyProgramsController`
Base route: `/api/loyalty/programs`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/loyalty/programs/{id:guid}` | — | |
| GET | `/api/loyalty/programs` | — | |
| GET | `/api/loyalty/programs/{id:guid}` | — | |
| POST | `/api/loyalty/programs` | — | |
| PUT | `/api/loyalty/programs/{id:guid}` | — | |
## `MeAccountController`
Base route: `/api/me`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/me/change-password` | — | Сменить пароль текущему юзеру. Требует текущий пароль для защиты от случайного/злонамеренного измене… |
## `MeSessionsController`
Base route: `/api/me/sessions`
| Method | Route | Permission | Summary |
|---|---|---|---|
| POST | `/api/me/sessions/revoke-all` | — | Гасит все refresh-токены текущего юзера. Использовать когда есть подозрение на угон cookies/пароля. |
## `MoySkladImportController`
Base route: `/api/admin/moysklad`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/moysklad/settings` | — | |
| POST | `/api/admin/moysklad/import-counterparties` | — | |
| POST | `/api/admin/moysklad/import-products` | — | |
| POST | `/api/admin/moysklad/test` | — | |
| PUT | `/api/admin/moysklad/settings` | — | |
## `MoySkladSyncStatusController`
Base route: `/api/moysklad`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/moysklad/sync-status` | — | |
## `OrgAuditLogController`
Base route: `/api/admin/audit-log`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/admin/audit-log` | — | |
| POST | `/api/admin/audit-log/export` | — | Sprint 22: streaming-export audit-log для compliance / расследований. Multi-tenant — query-filter пр… |
## `OrgExportController`
Base route: `/api/org/export`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/org/export` | — | |
| GET | `/api/org/export/download/{token}` | — | Anonymous download по токену. Не требует авторизации — security через 256-битный random token + TTL … |
| GET | `/api/org/export/{id:guid}` | — | |
| POST | `/api/org/export` | — | Создать новый экспорт. Возвращает 202 + Id; полезно сразу polled'ить GET /api/org/export/{id} до Sta… |
## `OrgFiscalSettingsController`
Base route: `/api/organization/fiscal`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/organization/fiscal` | — | |
| GET | `/api/organization/fiscal/providers` | — | Доступные значения провайдера для select'а в UI. Возвращаем массив, потому что enum-значения мы НЕ х… |
| POST | `/api/organization/fiscal/test-send` | — | Тестовая отправка: создаёт «фейк-чек» (in-memory, не в БД) и отправляет через выбранного провайдера.… |
| PUT | `/api/organization/fiscal` | — | |
## `OrganizationSettingsController`
Base route: `/api/organization`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/organization/settings` | — | |
| PUT | `/api/organization/settings` | — | |
## `PlatformSettingsController`
Base route: `/api/super-admin/platform-settings`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/super-admin/platform-settings` | — | |
| POST | `/api/super-admin/platform-settings/test-send` | — | |
| PUT | `/api/super-admin/platform-settings` | — | |
## `PosController`
Base route: `/api/pos/v1`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/pos/v1/sync` | — | |
| POST | `/api/pos/v1/sales` | — | |
## `PriceTypesController`
Base route: `/api/catalog/price-types`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/price-types/{id:guid}` | — | |
| GET | `/api/catalog/price-types` | — | |
| GET | `/api/catalog/price-types/{id:guid}` | — | |
| POST | `/api/catalog/price-types` | — | |
| PUT | `/api/catalog/price-types/{id:guid}` | — | |
## `ProductGroupsController`
Base route: `/api/catalog/product-groups`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/product-groups/{id:guid}` | — | |
| GET | `/api/catalog/product-groups` | — | |
| GET | `/api/catalog/product-groups/{id:guid}` | — | |
| POST | `/api/catalog/product-groups` | — | |
| PUT | `/api/catalog/product-groups/{id:guid}` | — | |
## `ProductImagesController`
Base route: `/api/catalog/products/{productId:guid}/images`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/products/{productId:guid}/images/{imageId:guid}` | — | |
| GET | `/api/catalog/products/{productId:guid}/images` | — | |
| POST | `/api/catalog/products/{productId:guid}/images` | — | |
| POST | `/api/catalog/products/{productId:guid}/images/{imageId:guid}/main` | — | |
## `ProductsController`
Base route: `/api/catalog/products`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/products/{id:guid}` | — | |
| GET | `/api/catalog/products` | — | |
| GET | `/api/catalog/products/barcode-duplicates` | — | Находит штрихкоды, привязанные к более чем одному товару в текущей организации. Уникальный индекс эт… |
| GET | `/api/catalog/products/by-barcode/{value}` | — | Точный поиск по штрихкоду (для сканера). 0 → 404, 1 → объект, несколько → { items: [...] } чтобы UI … |
| GET | `/api/catalog/products/export` | — | Sprint 19: экспорт списка товаров с теми же фильтрами что и /api/catalog/products. Сервер-side генер… |
| GET | `/api/catalog/products/quick-search` | — | Лёгкий поиск для inline-добавления строк в документы (приёмка, продажа). Ранжирует точное совпадение… |
| GET | `/api/catalog/products/{id:guid}` | — | |
| PATCH | `/api/catalog/products/{id:guid}/price` | — | |
| POST | `/api/catalog/products` | — | |
| POST | `/api/catalog/products/bulk-update` | — | |
| POST | `/api/catalog/products/import-csv` | — | |
| POST | `/api/catalog/products/import/1c-csv` | — | |
| POST | `/api/catalog/products/{id:guid}/recalc-retail` | — | «Привести розничную к себестоимости»: ставит дефолтную розничную цену = ceil(Cost * (1 + Group.Marku… |
| PUT | `/api/catalog/products/{id:guid}` | — | |
## `ProfitReportController`
Base route: `/api/reports/profit`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/profit` | — | |
| GET | `/api/reports/profit/export` | — | |
## `PromotionsController`
Base route: `/api/promotions`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/promotions/{id:guid}` | — | |
| GET | `/api/promotions` | — | |
| GET | `/api/promotions/{id:guid}` | — | |
| POST | `/api/promotions` | — | |
| PUT | `/api/promotions/{id:guid}` | — | |
## `RetailPointsController`
Base route: `/api/catalog/retail-points`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/retail-points/{id:guid}` | — | |
| GET | `/api/catalog/retail-points` | — | |
| GET | `/api/catalog/retail-points/{id:guid}` | — | |
| POST | `/api/catalog/retail-points` | — | |
| PUT | `/api/catalog/retail-points/{id:guid}` | — | |
## `RetailSalesController`
Base route: `/api/sales/retail`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/sales/retail/{id:guid}` | — | |
| GET | `/api/sales/retail` | — | |
| GET | `/api/sales/retail/export` | — | Sprint 19: экспорт списка чеков с фильтрами status/storeId/from/to. |
| GET | `/api/sales/retail/stats` | — | Aggregated sales metrics + daily series for the dashboard. Series buckets are days; defaults to last… |
| GET | `/api/sales/retail/{id:guid}` | — | |
| POST | `/api/sales/retail` | — | |
| POST | `/api/sales/retail/{id:guid}/create-return` | — | POST /create-return — копирует строки проведённого чека в новый Draft с IsReturn=true и ReferenceSal… |
| POST | `/api/sales/retail/{id:guid}/post` | — | |
| POST | `/api/sales/retail/{id:guid}/unpost` | — | |
| PUT | `/api/sales/retail/{id:guid}` | — | |
## `SalesReportController`
Base route: `/api/reports/sales`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/sales` | — | |
| GET | `/api/reports/sales/export` | — | |
## `StockController`
Base route: `/api/inventory`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/inventory/movements` | — | |
| GET | `/api/inventory/stock` | — | |
| GET | `/api/inventory/stock/export` | — | Sprint 19: экспорт остатков. |
## `StockReportController`
Base route: `/api/reports/stock`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/reports/stock` | — | |
| GET | `/api/reports/stock/export` | — | |
## `StoresController`
Base route: `/api/catalog/stores`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/stores/{id:guid}` | — | |
| GET | `/api/catalog/stores` | — | |
| GET | `/api/catalog/stores/{id:guid}` | — | |
| POST | `/api/catalog/stores` | — | |
| PUT | `/api/catalog/stores/{id:guid}` | — | |
## `SuperAdminController`
Base route: `/api/super-admin`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/super-admin/audit-log` | — | |
| GET | `/api/super-admin/dashboard` | — | |
| GET | `/api/super-admin/settings` | — | |
| GET | `/api/super-admin/setup-status` | — | |
| PUT | `/api/super-admin/settings` | — | |
## `SuperAdminEmployeesController`
Base route: `/api/super-admin/organizations/{orgId:guid}/employees`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}` | — | |
| GET | `/api/super-admin/organizations/{orgId:guid}/employees` | — | |
| GET | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}/account/toggle-active` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}/reset-password` | — | |
| POST | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}/toggle-active` | — | |
| PUT | `/api/super-admin/organizations/{orgId:guid}/employees/{id:guid}` | — | |
## `SuperAdminOrganizationsController`
Base route: `/api/super-admin/organizations`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/super-admin/organizations/{id:guid}` | — | |
| GET | `/api/super-admin/organizations` | — | |
| GET | `/api/super-admin/organizations/{id:guid}` | — | |
| POST | `/api/super-admin/organizations` | — | |
| POST | `/api/super-admin/organizations/{id:guid}/archive` | — | |
| POST | `/api/super-admin/organizations/{id:guid}/change-owner` | — | |
| POST | `/api/super-admin/organizations/{id:guid}/restore` | — | |
| PUT | `/api/super-admin/organizations/{id:guid}` | — | |
## `SuperAdminUnitsOfMeasureController`
Base route: `/api/super-admin/units-of-measure`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/super-admin/units-of-measure/{id:guid}` | — | Soft-delete: IsActive=false. Если на единицу ссылаются продукты или активные org-junction'ы — 409 со… |
| GET | `/api/super-admin/units-of-measure` | — | |
| GET | `/api/super-admin/units-of-measure/{id:guid}` | — | |
| POST | `/api/super-admin/units-of-measure` | — | |
| PUT | `/api/super-admin/units-of-measure/{id:guid}` | — | |
## `SupplierReturnsController`
Base route: `/api/purchases/supplier-returns`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/purchases/supplier-returns/{id:guid}` | — | |
| GET | `/api/purchases/supplier-returns` | — | |
| GET | `/api/purchases/supplier-returns/{id:guid}` | — | |
| POST | `/api/purchases/supplier-returns` | — | |
| POST | `/api/purchases/supplier-returns/{id:guid}/post` | — | |
| POST | `/api/purchases/supplier-returns/{id:guid}/unpost` | — | |
| PUT | `/api/purchases/supplier-returns/{id:guid}` | — | |
## `SuppliesController`
Base route: `/api/purchases/supplies`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/purchases/supplies/{id:guid}` | — | |
| GET | `/api/purchases/supplies` | — | |
| GET | `/api/purchases/supplies/export` | — | Sprint 19: экспорт списка приёмок с теми же фильтрами. |
| GET | `/api/purchases/supplies/{id:guid}` | — | |
| POST | `/api/purchases/supplies` | — | |
| POST | `/api/purchases/supplies/{id:guid}/post` | — | |
| POST | `/api/purchases/supplies/{id:guid}/unpost` | — | |
| PUT | `/api/purchases/supplies/{id:guid}` | — | |
## `TelegramBindingController`
Base route: `/api/organization/telegram`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/organization/telegram` | — | |
| GET | `/api/organization/telegram/status` | — | |
| PUT | `/api/organization/telegram/bind` | — | |
## `TransfersController`
Base route: `/api/inventory/transfers`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/inventory/transfers/{id:guid}` | — | |
| GET | `/api/inventory/transfers` | — | |
| GET | `/api/inventory/transfers/{id:guid}` | — | |
| POST | `/api/inventory/transfers` | — | |
| POST | `/api/inventory/transfers/{id:guid}/post` | — | |
| POST | `/api/inventory/transfers/{id:guid}/unpost` | — | |
| PUT | `/api/inventory/transfers/{id:guid}` | — | |
## `TwoFactorController`
Base route: `/api/me/2fa`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/me/2fa/status` | — | |
| POST | `/api/me/2fa/disable` | — | |
| POST | `/api/me/2fa/enroll` | — | |
| POST | `/api/me/2fa/verify` | — | |
## `UnitsOfMeasureController`
Base route: `/api/catalog/units-of-measure`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/catalog/units-of-measure/{id:guid}/enable` | — | Отключить global для текущей орги. Если на эту единицу ссылаются продукты орги — 409 со списком назв… |
| GET | `/api/catalog/units-of-measure` | — | Список единиц для текущей орги: только включённые active globals. Для SuperAdmin без override — все … |
| GET | `/api/catalog/units-of-measure/{id:guid}` | — | |
| POST | `/api/catalog/units-of-measure/{id:guid}/enable` | — | Включить global для текущей орги. Идемпотентно: повторный вызов отдаёт 204 и не плодит дубликатов ju… |
## `UploadsController`
Base route: `/uploads`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/uploads/{*path}` | — | |
## `UserPresetsController`
Base route: `/api/user/presets`
| Method | Route | Permission | Summary |
|---|---|---|---|
| DELETE | `/api/user/presets/{id:guid}` | — | |
| GET | `/api/user/presets` | — | |
| POST | `/api/user/presets` | — | |
| PUT | `/api/user/presets/{id:guid}` | — | |
## `WhatsNewController`
Base route: `/api/whats-new`
| Method | Route | Permission | Summary |
|---|---|---|---|
| GET | `/api/whats-new` | — | |