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

92 lines
3.7 KiB
Markdown
Raw Permalink 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.

# Импорты в 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-пример
```bash
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"
```
### Ответ
```json
{
"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-токен МойСклада).