Systeme Electric connector
backend/internal/core/ingestion/infra/systeme — третий адаптер supplier-connector контракта (ADR-0024). Iter-1 использует BulkSnapshotPipeline (catalog/prices/stock через paged/batch endpoints). Cursor retrofit на iso_date запланирован (см. tracium_path_to_launch.md).
Подробная спецификация — в connectors/systeme/spec.md, mapping — в connectors/systeme/mapping.md, rate budget — в connectors/systeme/rate-budget.md.
Transport + endpoints
REST/JSON. Endpoints под /new-api/JSON/:
| Path | Purpose |
|---|---|
GET /new-api/JSON/getdata | catalog + characteristics (full snapshot, paged) |
GET /new-api/JSON/getprice | prices (default Moscow rates) |
GET /new-api/JSON/getekaterinburgprice | региональный override (через PriceMethod) |
GET /new-api/JSON/getstock | diagnostic/per-SKU stock |
GET /new-api/JSON/getstockall | scheduled full all-warehouses stock snapshot |
Auth: query parameter accessCode=<token> на каждом запросе. Никакого login flow — токен выдаётся Systeme Electric из их кабинета (Developers → API).
Auth
AuthSchemeAPIToken в cabinet supplier_catalog: customer вводит API token в одно поле «API token». Backend хранит как secret_value JSON {api_token}. SessionManager не делает сетевых вызовов — просто прокидывает accessCode в query.
Capabilities (systeme/capabilities.go)
| Axis | Value |
|---|---|
| Transport | REST |
| PriceSet | Net only |
| Stock | true; StockForecast: false |
| Media | images + videos + certificates (no watermark) |
| Marketplace | false |
| IncrementalSync | Supported=false (cursor retrofit planned) |
| ScheduledRefresh.Catalog | paged |
| ScheduledRefresh.Prices | batch by commercialRef for the current catalog page |
| ScheduledRefresh.Stock | full export (getstockall) |
| ScheduledRefresh.Specs | paged |
| MultiCurrency | RUB only |
UsesBulkSnapshot()=true ⇒ orchestrator маршрутизирует Systeme через BulkSnapshotPipeline.
Session + rate-limit
SessionManager.AcquireвозвращаетSessionHandleсaccessCodeвOpaque, без сетевого вызова. ValidUntil = +100 лет.- Rate-limit headers поставщика —
Retry-After(signal’ом дляRateLimitederror code). - Запрос всегда GET; query string содержит
accessCode;commercialRefдобавляется только для diagnostic/per-SKU lookup. Scheduled stock refresh не передаетcommercialRef, а забирает полныйgetstockall.
Scheduled refresh strategy
systeme intentionally runs stock before catalog:
getstockallis fetched once for all warehouses.- Rows with any positive
stocks[].countare emitted immediately as stock-only observations. This keeps customer availability current even when the full catalog still has many pages left. - Catalog rows are streamed page-by-page from
getdata. - For each catalog page,
getpriceis called once with a comma-separatedcommercialRefbatch for only that page’s SKU list. - Catalog observations still include the matching stock row when it is present,
and empty stock when
getstockallcompleted and the SKU has no stock row.
The stock-only pass deliberately does not wait for catalog enrichment. It may create/update a minimal supplier offer named by SKU; later catalog pages enrich the same supplier SKU with name, brand, media, categories, and characteristics.
Особенности
- Нет login flow — Basic Auth-аналог через query, простой SessionManager.
- Региональные цены —
getekaterinburgpriceотдельный endpoint.PriceMethodв config’е выбирает default. Multi-region проекты используют per-region credentials илиiterчерез price-methods. - Live contract 2026-05-07 —
getstockallвернул30051rows (~10.8 MB);commercialRefвстречается и string, и number,stocks[].countприходит string. В реальном smoke из 54407 warehouse rows положительными были 16768, что соответствует 12018 SKU с наличием.getprice?commercialRef=a,b,cвозвращает неполное пересечение для batch-list, поэтому отсутствие цены для конкретного SKU в batch является допустимым состоянием, а не ошибкой всего тика. - No native ETIM coding — Systeme отдаёт собственные ETIM-7 references? (TBD для cycle следующего после auto-classification).
Roadmap
- Cursor retrofit — Systeme имеет
sinceили ISO-date semantics вgetdatapayload (TBD).IncrementalSync.Kind=date_basedпосле retrofit. ~15-20 commits. - Region matrix — поддержка нескольких регионов одновременно (Moscow + Ekaterinburg + …). Сейчас один region на credential.
Связанные документы
pipelines.md— BulkSnapshotPipeline.framework.md— общий connector framework.systeme/spec.md,systeme/mapping.md,systeme/rate-budget.md— детали.../../20-architecture/adr/0024-supplier-connector-contract.md.