feat: adds PDF import with conversion to JSON 1.0

- Accept only PDF and JSON files in import modal and API
- Convert PDF statements to JSON 1.0 via LLM (OpenAI-compatible)
- Use multipart/form-data for file upload (multer, 15 MB limit)
- Add LLM_API_KEY and LLM_API_BASE_URL for configurable LLM endpoint
- Update ImportModal to validate type and send FormData
- Add postFormData to API client for file upload
This commit is contained in:
Anton
2026-03-13 13:38:02 +03:00
parent d1536b8872
commit 975f2c4fd2
13 changed files with 745 additions and 48 deletions

View File

@@ -2,7 +2,7 @@
## Назначение
Эндпоинт принимает банковскую выписку в формате JSON 1.0 (см. `format.md`) и атомарно импортирует транзакции в БД.
Эндпоинт принимает банковскую выписку (PDF или JSON) и атомарно импортирует транзакции в БД.
## Метод и URL
@@ -16,7 +16,15 @@
## Тело запроса
JSON строго по схеме 1.0 (`format.md`). Content-Type: `application/json`.
**Content-Type:** `multipart/form-data`. Поле: `file`.
Допустимые типы файлов:
- **PDF** — банковская выписка. Конвертируется в JSON 1.0 через LLM (требуется `LLM_API_KEY`).
- **JSON** — файл по схеме 1.0 (см. `format.md`).
При другом типе файла — `400 Bad Request`: «Допустимы только файлы PDF или JSON».
Пример структуры JSON 1.0:
```json
{
@@ -207,6 +215,8 @@ accountNumber|operationAt|amountSigned|commission|normalizedDescription
| Код | Ситуация |
|-----|--------------------------------------------------------------------------|
| 200 | Импорт выполнен успешно |
| 400 | Невалидный JSON или нарушение структуры схемы 1.0 |
| 400 | Файл не загружен; неверный тип (не PDF и не JSON); некорректный JSON; ошибка извлечения текста из PDF |
| 401 | Нет действующей сессии |
| 422 | Семантическая ошибка валидации (некорректные данные, ошибка при вставке) |
| 422 | Семантическая ошибка валидации; результат конвертации PDF не соответствует схеме 1.0 |
| 502 | Ошибка LLM при конвертации PDF |
| 503 | Конвертация PDF недоступна (не задан LLM_API_KEY) |