← Проєкти

Фінансова автоматизація · MVP

Автоматизація виписок

Керований конвеєр: банківські виписки в PDF стають перевіреними записами у Finmap, без дублів.

  • Python
  • Streamlit
  • SQLite
  • Finmap API
2026

По одному рядку

PDF з банку — це ще не дані

Рядок виписки — це дата, сума й абзац, який банк написав сам для себе. Раніше з цього робили запис руками, щомісяця. Виберіть рядок і подивіться, що з ним робить конвеєр.

Виписка, як її вигрузили

kredo-2026-03.pdf01–31 березня 2026 · Основний рахунок

Виберіть рядок

Що отримує Finmap

Один вхідний рядок, дві операції

1 рядок → 2 операції
дохідДохід без ПДВ
Рахунок
Основний · UA…3099
Сума
35 000.00 UAH
Категорія
Юридичні послуги
Контрагент
Meridian Foods
Зовнішній id
…7c4a1f:main
дохідПДВ
Рахунок
Основний · UA…3099
Сума
7 000.00 UAH
Категорія
ПДВ
Проєкт
ПДВ
Зовнішній id
…7c4a1f:pdv
Як воно вирішило
  1. ПДВ — це рівно одна шоста від суми з податком, тому дві суми ніколи не розходяться на округленні.
  2. Ділить за рахунком, а не за формулюванням: рядок, який забув згадати ПДВ, розділять теж.

Свій розбірник на кожен формат банку: Kredo, Raiffeisen, операційний експорт і зарплатна відомість Mono, а за ними — загальний резервний. Суми, імена й закінчення рахунків тут умовні.

Чому не страшно натиснути двічі

Імпортуйте ту саму виписку знову. Нічого не подвоїться

Період продовжили на два дні, хтось запустив із другої машини, файл затягнули двічі — руками кожен із цих випадків подвоює місяць, і знаходять це аж через тижні. Тут не подвоїться нічого, бо кожна операція несе власну ідентичність.

Файл, який імпортуютьkredo-2026-03.pdf32 рядки · вигружено повторно 30 березня, з двома зайвими днями в кінці16У Finmapоперацій на цей момент

Імпортувати знову

  1. 01Перший імпорт28 березня, виписка в тому вигляді, який був
    Прочитано рядків
    16
    Уже є
    0
    Записано
    16

    Записано шістнадцять операцій.

  2. 02Повторно вигружений файл30 березня, той самий період плюс два дні
    Прочитано рядків
    32
    Уже є
    16
    Записано
    16

    Перетин розпізнано. Записано лише нові дні.

  3. 03Той самий файлЗатягнули знову, навмисно
    Прочитано рядків
    32
    Уже є
    32
    Записано
    0

    Прочитано повністю, не записано нічого.

Три місця, де ловлять повтор
  1. 01Усередині партіїДва експорти в одній папці перетинаються. Другу копію позначають ще до першого запиту.
  2. 02Проти того, що вже відправилиКожна опублікована операція тримає ідентичність локально, з датою відправлення, — тому повторний період ловлять і датують.
  3. 03На дальньому кінціЯкщо обидва проґавили, Finmap відмовляє самій ідентичності — і цю відмову читають як успіх, а не помилку.
З чого складається ідентичність

Десять речей, зведених у хеш. Той самий рядок — та сама ідентичність, назавжди.

  • 01банк
  • 02IBAN рахунку
  • 03час проведення
  • 04сума
  • 05валюта
  • 06напрям
  • 07IBAN контрагента
  • 08номер документа
  • 09призначення
  • 10версія правил

IBAN і формулювання спочатку нормалізують, тому пробіли й регістр не зроблять із одного рядка два.

Кожен запуск перевіряє ще й власну арифметику виписки — початковий залишок плюс усі рухи проти кінцевого — і розбіжність стає попередженням на чернетці, а не блокуванням.

Що змінилося

Та сама виписка: набрана руками й імпортована

Банк в обох випадках надсилає той самий PDF. Змінюється кількість рішень, які людина ухвалює руками, і те, що станеться, коли файл прийде двічі.

Та сама банківська виписка, введена руками й імпортована через конвеєр
Що змінюєтьсяРукамиПо одному рядку, у FinmapЧерез конвеєрСпочатку чернетка, тоді публікація
Завести випискуРукамиКожен рядок вичитують із PDF і перебивають — для кожного рахунку й кожного місяцяЧерез конвеєрPDF розбирають, і кожен рядок приходить чернеткою операції
Вирішити, що це за рядокРукамиКатегорію вибирають з памʼяті, і по-різному залежно від того, хто це робитьЧерез конвеєрВирішують правила на ключових словах, розпізнавання податків і план платежів — і кожне каже, чому
Гроші між своїми рахункамиРукамиЗаводять двічі, витратою й доходом, і місяць виглядає активнішим, ніж бувЧерез конвеєрРозпізнають як переказ за реєстром рахунків, тому він не доходить до прибутку
ПДВ усередині платежу клієнтаРукамиВиділяють руками в кінці кварталу — або не виділяють зовсімЧерез конвеєрОдин вхідний рядок стає доходом і рядком ПДВ: пʼять шостих і одна шоста
Той самий період імпортували двічіРукамиПодвоїлося, і через тижні це знайшов той, хто звернув увагу на залишокЧерез конвеєрЛовлять на трьох рівнях, ще нічого не записавши, і показують дату оригіналу
Перевірити, що нічого не втратилиРукамиКінцевий залишок звіряють руками, коли є часЧерез конвеєрПочатковий плюс рухи звіряють із кінцевим на кожному запуску
Рядок, на який ні в кого немає правилаРукамиВгадують або відкладають у нотатку, яка переживає місяцьЧерез конвеєрПотрапляє в резервну категорію з позначкою unmapped і чекає на людину
Якщо ваші виписки досі набирають рядок за рядком, давайте поговоримо.