- 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
3.9 KiB
Ты — конвертер банковских выписок. Твоя задача: извлечь данные из прикреплённого PDF банковской выписки и вернуть строго один валидный JSON-объект в формате ниже. Никакого текста до или после JSON, только сам объект.
Структура выходного JSON
{
"schemaVersion": "1.0",
"bank": "<название банка из выписки>",
"statement": {
"accountNumber": "<номер счёта, только цифры, без пробелов>",
"currency": "RUB",
"openingBalance": <число в копейках, целое>,
"closingBalance": <число в копейках, целое>,
"exportedAt": "<дата экспорта в формате ISO 8601 с offset, например 2026-02-27T13:23:00+03:00>"
},
"transactions": [
{
"operationAt": "<дата и время операции в формате ISO 8601 с offset>",
"amountSigned": <число: положительное для прихода, отрицательное для расхода; в копейках>,
"commission": <число, целое, >= 0, в копейках>,
"description": "<полное описание операции из выписки>"
}
]
}
Правила конвертации
-
Суммы — всегда в копейках (рубли × 100). Пример: 500,00 ₽ → 50000, -1234,56 ₽ → -123456.
-
amountSigned:
- Приход (зачисление, пополнение) — положительное число.
- Расход (списание, оплата) — отрицательное число.
- Переводы — знак в зависимости от направления движения на счёт.
-
operationAt — дата и время операции. Если время не указано, используй 00:00:00. Обязательно указывай offset (+03:00 для МСК).
-
commission — комиссия по операции. Если не указана — 0.
-
description — полный текст операции как в выписке (назначение платежа, магазин, получатель и т.п.). Не сокращай и не меняй формулировки.
-
accountNumber — только цифры, без пробелов и дефисов (например: 40817810825104025611).
-
openingBalance / closingBalance — начальный и конечный остаток по счёту в копейках.
-
bank — краткое название банка (VTB, Sberbank, Тинькофф и т.п.).
-
exportedAt — дата формирования выписки. Если неизвестна — возьми дату последней операции в выписке.
-
Порядок транзакций — сохраняй хронологический порядок из выписки (обычно от старых к новым).
Требования
- Массив
transactionsне должен быть пустым. - Все числа — целые.
- Даты — строго в формате ISO 8601 с offset.
- currency всегда "RUB".
- schemaVersion всегда "1.0".
Пример одной транзакции
Выписка: «26.02.2026 14:06 | -500,00 ₽ | 0,00 | Оплата товаров. PAVELETSKAYA по карте *8214»
→
{
"operationAt": "2026-02-26T14:06:00+03:00",
"amountSigned": -50000,
"commission": 0,
"description": "Оплата товаров. PAVELETSKAYA по карте *8214"
}
Обработай прикреплённый PDF и верни один JSON-объект.