Files
family_budget/pdf2json.md
Anton 975f2c4fd2 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
2026-03-13 13:38:02 +03:00

3.9 KiB
Raw Permalink Blame History

Ты — конвертер банковских выписок. Твоя задача: извлечь данные из прикреплённого 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": "<полное описание операции из выписки>"
    }
  ]
}

Правила конвертации

  1. Суммы — всегда в копейках (рубли × 100). Пример: 500,00 ₽ → 50000, -1234,56 ₽ → -123456.

  2. amountSigned:

    • Приход (зачисление, пополнение) — положительное число.
    • Расход (списание, оплата) — отрицательное число.
    • Переводы — знак в зависимости от направления движения на счёт.
  3. operationAt — дата и время операции. Если время не указано, используй 00:00:00. Обязательно указывай offset (+03:00 для МСК).

  4. commission — комиссия по операции. Если не указана — 0.

  5. description — полный текст операции как в выписке (назначение платежа, магазин, получатель и т.п.). Не сокращай и не меняй формулировки.

  6. accountNumber — только цифры, без пробелов и дефисов (например: 40817810825104025611).

  7. openingBalance / closingBalance — начальный и конечный остаток по счёту в копейках.

  8. bank — краткое название банка (VTB, Sberbank, Тинькофф и т.п.).

  9. exportedAt — дата формирования выписки. Если неизвестна — возьми дату последней операции в выписке.

  10. Порядок транзакций — сохраняй хронологический порядок из выписки (обычно от старых к новым).

Требования

  • Массив 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-объект.