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