food-market/docs/imports.md
nns aa83f82dc5
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
feat(s22): data tooling — export/import + schema docs + anon dump (7 пунктов)
1. GDPR org export — domain OrgExport + Phase22a миграция, OrgExportJob
   собирает ZIP с JSON по каждой сущности через IObjectStorage,
   DownloadToken 64-hex + 24h TTL + email-notify.
   POST /api/org/export, GET /api/org/export[/{id}], GET download/{token}.

2. 1C CSV import — POST /api/catalog/products/import/1c-csv:
   Windows-1251/UTF-8 BOM auto-detect, разделитель ;/, русские заголовки
   (Артикул/Наименование/Единица/Цена/Группа/Штрихкод) или английские.
   Нормализация unit-кодов (шт/кг/г/л/мл/упак). Делегирует на ImportCsv
   (транзакция, multi-tenant). docs/imports.md.

3. deploy/anonymize-prod.sh — pg_dump прода → restore во временную БД →
   UPDATE PII (email→user{N}@example.kz, phone→+7700111{N:04}, password→
   тестовый hash, BIN/IIN синтетические, MoySkladToken=NULL, аудиты
   TRUNCATE) → pg_dump → gz файл.

4. DbSchemaDocsJob (weekly вс 05:00 UTC) — information_schema → md с
   таблицами + колонками + FK + mermaid ER-диаграммой (топ-20 таблиц).
   Сохраняет в content-root db-schema-generated.md.

5. POST /api/admin/audit-log/export?format=csv|jsonl — streaming через
   AsAsyncEnumerable. UTF-8 BOM для CSV, JSONL для grep'a. Multi-tenant.

6. GET /api/moysklad/sync-status — агрегат по import_jobs:
   { configured, lastSuccessAt, errorCountLast7Days, pendingCount,
     byKind: { products: KindStatus, counterparties: KindStatus } }.
   Stub если MoySkladToken=null.

7. docs/ARCHITECTURE.md — финальный итог 22 спринтов:
   - Sprint 13-22 changes-сводка
   - «Реализовано полностью» секция
   - «Scaffolding» таблица с указанием что нужно от user'а
   - «Не реализовано» секция (прод, SSO callback, KZ-перевод, POS-тест)
   - Актуальная файловая структура

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 23:00:54 +05:00

3.7 KiB
Raw Permalink Blame History

Импорты в Food Market

Универсальный CSV-импорт товаров

Endpoint: POST /api/catalog/products/import-csv

JSON body со списком rows — клиент парсит CSV, сервер commit'ит транзакцией. См. Sprint 19 docs.

Импорт из 1С (Бухгалтерия / УТ / Розница)

Endpoint: POST /api/catalog/products/import/1c-csv?autoCreateGroup=true

Content-Type: text/csv, text/plain, application/octet-stream или multipart/form-data (form-file).

Кодировка: автодетект — UTF-8 with BOM или Windows-1251 (стандарт 1С Excel-RU).

Разделитель: автодетект по header-строке — ; (1С) или ,.

Формат заголовка

Обязательная колонка: Наименование (или name).

Опциональные (любой регистр, оба языка):

Русский English Куда мапится
Артикул code, article Product.Article (создание пока пропускает)
Наименование name, title Product.Name
Единица unit, ед, ед.изм. UnitOfMeasure по нормализованному коду
Цена price, розничная цена ProductPrice.Amount (системный priceType)
Группа category, категория, родитель ProductGroup.Name (autoCreate если нет)
Штрихкод barcode, штрих-код ProductBarcode.Code (первый, IsPrimary=true)

Нормализация единиц

шт, штука, pcsшт; кг, kgкг; г, gг; л, lл; мл, mlмл; м, mм; упак, уп, packупак.

Если не распознали — передаётся как есть; если такого UnitOfMeasure нет — fallback на дефолтную единицу организации.

Пример

"Артикул";"Наименование";"Единица";"Цена";"Группа";"Штрихкод"
"00001";"Молоко 2.5% 1л";"шт";"450";"Молочные продукты";"4870000000017"
"00002";"Хлеб белый 500г";"шт";"180";"Хлебобулочные";"4870000000024"
"00003";"Гречка";"кг";"650";"Крупы";""

Curl-пример

curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: text/csv; charset=windows-1251" \
  --data-binary @export-1c.csv \
  "https://admin.food-market.kz/api/catalog/products/import/1c-csv?autoCreateGroup=true"

Ответ

{
  "created": 248,
  "skipped": 12,
  "errors": [
    { "row": 14, "error": "Дубликат штрихкода в импорте: 4870000000031" }
  ],
  "ids": ["...", "..."]
}
  • При errors.length > 0 транзакция откатывается, ничего не создаётся.
  • При created > 0 — все 248 товаров добавлены атомарно.

Что НЕ импортируется

  • НДС-ставка (берётся дефолтная Country.VatRate).
  • Себестоимость (Cost) — рассчитывается на первой приёмке.
  • Изображения (нужен отдельный endpoint загрузки картинок).
  • Цены типов кроме системной (нужен расширенный CSV-формат).
  • Поставщики (DefaultSupplier) — связь через имя нестабильна.

Импорт из МойСклад

См. docs/moysklad-import.md (отдельный flow через OAuth-токен МойСклада).