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>
3.7 KiB
Импорты в 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-токен МойСклада).