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