Компанія з рахунками у кількох банках — Приват, Моно, Аваль, Ощад — щодня повторює один і той самий ручний крок: відкрити клієнт-банк, вивантажити виписку, перенести рядки в журнал Odoo. У кожного банку свій формат файлу і свій ризик задвоїти транзакцію при повторному імпорті.
KitWorks закриває цю рутину набором з 16 модулів для Odoo Accounting. Частина підключається до банку напряму через API, частина парсить файл виписки у форматі, який банк реально віддає (DBF, XLS, CSV, XLSX), частина — збагачує вже імпортовану виписку додатковими даними. Разом це 13 банківських інтеграцій (не банків — Monobank, наприклад, представлений двома окремими модулями для особистого і корпоративного API), окремий модуль-збагачувач (kw_bank_statement_liqpay_info) і 2 базові інфраструктурні модулі — kw_bank_statement і kw_bank_statement_api, на яких стоять відповідно всі 13 інтеграцій і, серед них, 4 API-модулі.
Ця стаття — карта: які способи підключення є і де читати технічні деталі кожної інтеграції.
Три способи підключення
API — коли банк надає доступ. Модуль підключається до офіційного API банку і забирає нові транзакції за розкладом. Cron-задача Odoo кожні 5 хвилин обирає один банківський журнал — той, що найдовше чекав синхронізації, — і оновлює лише його, по колу між усіма активними журналами. Це періодичний опитувальний цикл, не миттєвий push; практична затримка — хвилини, не дні. Для Monobank Business і Укргазбанку модуль сам знаходить усі рахунки компанії за токеном. Для ПриватБанку (Autoclient API) такого ендпоінту немає — IBAN рахунку потрібно вказати в налаштуваннях журналу вручну. Спосіб підходить, якщо банк узагалі надає бізнес-API — це Monobank, ПриватБанк і Укргазбанк із поточного списку.
Файловий імпорт — коли банк API не дає. Бухгалтер сам експортує виписку з клієнт-банку у форматі DBF, XLS, CSV або XLSX і завантажує файл через кнопку «Імпорт виписки» на банківському журналі в Odoo. Автосинхронізації тут немає — це свідомий ручний крок, який модуль лише прибирає з "переписати вручну 200 рядків" до "натиснути одну кнопку". Формат специфічний для кожного банку: наприклад, у Кредобанку напрямок дебет/кредит визначається українським текстовим маркером у файлі, тому експорт має бути в українській локалі.
Автозбагачення — коли дані вже є, але неповні. Це окремий випадок: модуль нічого не імпортує сам, а дописує контекст до вже імпортованого рядка виписки. Приклад — kw_bank_statement_liqpay_info: рядки виписки ПриватБанку від LiqPay-платежів виглядають як технічний референс без імені платника; модуль звертається до LiqPay status API і дописує ім'я, телефон і опис платежу до вже існуючого рядка. Механізм працює, лише якщо в налаштуваннях журналу вказано власні публічний і приватний ключі LiqPay-мерчанта (kw.bank.statement.liqpay.config) — без них рядок лишається як є, без помилки. За описом модуля на Apps Store, він не імпортує транзакції і не створює зв'язку з sale.order — лише збагачує вже наявний рядок виписки для зручності читання.
13 банківських інтеграцій — хто підключений і як
| Банк / сервіс | Спосіб | Модуль | Формат / API | Джерело |
|---|---|---|---|---|
| ПриватБанк (Privat24 для бізнесу) | API | kw_bank_statement_privat24_api |
Autoclient API | стаття про ПриватБанк API |
| Monobank (особистий / ФОП) | API | kw_bank_statement_monobank_api |
api.monobank.ua/personal | стаття про три банківські API |
| Monobank Business (юрособи) | API | kw_bank_statement_monobank_corp_api |
corp-api.monobank.ua/ext/v1 | стаття про Monobank Corporate API |
| Укргазбанк | API | kw_bank_statement_ukrgasbank_api |
API «Мій Укргазбанк» | стаття про три банківські API |
| Райффайзен Банк Аваль | файл | kw_bank_statement_aval_dbf |
DBF | стаття про 5 файлових банків |
| Ощадбанк | файл | kw_bank_statement_oschadbank_dbf |
DBF | стаття про 5 файлових банків |
| ОТП Банк | файл | kw_bank_statement_otp_dbf |
DBF | стаття про 5 файлових банків |
| ПУМБ | файл | kw_bank_statement_pumb_dbf |
DBF | стаття про 5 файлових банків |
| Кредобанк | файл | kw_bank_statement_kredobank_xls |
XLS | стаття про 5 файлових банків |
| ПриватБанк (Privat24, роздрібний рахунок) | файл | kw_bank_statement_privat24_xls |
XLS | лістинг Apps Store |
| iFOBS (клієнт-банкінг) | файл | kw_bank_statement_ifobs_xls |
XLS | лістинг Apps Store |
| iBank2UA (клієнт-банкінг) | файл | kw_bank_statement_ibank2ua_csv |
CSV | лістинг Apps Store |
| NovaPay | файл | kw_bank_statement_novapay_xlsx |
XLSX | лістинг Apps Store |
Загальний огляд усіх банків із таблицею — також у статті "13 українських банків + Odoo".
Окремо — LiqPay-enricher для виписки ПриватБанку, який не входить у ці 13, бо не є самостійною банківською інтеграцією.
Що спільне для всіх модулів
Уся родина стоїть на двох допоміжних модулях (hidden framework, підтягуються автоматично як залежність):
kw_bank_statement— базовий модуль. Додає до рядка виписки поля для сирих даних банку (ім'я контрагента як його передав банк, рахунок, ЄДРПОУ, МФО, опис) і детермінований ключ дедуплікації з обмеженням SQL UNIQUE — це технічна причина, чому повторний імпорт того самого періоду не створює дублів. Прив'язка контрагента йде за ЄДРПОУ або банківським рахунком. (лістинг Apps Store)kw_bank_statement_api— базовий фреймворк для API-банків. Розширює журнал полями статусу синхронізації, оркеструє cron-задачу, яка обробляє журнали по черзі, і логує HTTP-запити до банку для трасування помилок. На ньому стоять усі 4 API-модулі. (лістинг Apps Store)
Чого ця родина модулів не робить
Хаб не радить, який банк обрати: тут лише показано, що інтеграція технічно існує і як вона працює, а вибір банку лишається бізнес-рішенням клієнта.
Для файлових банків (DBF/XLS/CSV/XLSX) немає фонової синхронізації — завантаження файлу це свідомий ручний крок бухгалтера, не автоматична задача.
Autoclient API ПриватБанку не має ендпоінту "покажи всі мої рахунки": помилка в IBAN на етапі налаштування означає порожню виписку, а не підказку від банку.
Enricher kw_bank_statement_liqpay_info дописує ім'я й телефон платника до рядка виписки, але не створює зв'язок із записом sale.order.
Токен для Monobank Business видає банк окремо, на запит компанії, і узгодження може зайняти час — підключення краще планувати заздалегідь, а не в останній день перед запуском.
Питання, які виникають найчастіше
Чи можна підключити кілька банків одночасно? Так. Кожен банк — окремий банківський журнал зі своїми реквізитами й розкладом синхронізації; дедуплікація працює в межах кожного журналу окремо, а партнерська база спільна для всієї системи. (Джерело: стаття про три банківські API)
Чим відрізняються модулі для Privat24 API та Privat24 XLS?
Це два різні продукти в Apps Store, бо й API-ендпоінти в ПриватБанку для бізнес-рахунку і для фізосіб/ФОП різні: kw_bank_statement_privat24_api — Autoclient API для бізнес-рахунку, kw_bank_statement_privat24_xls — файловий імпорт роздрібного XLS-експорту. (Джерело: стаття про ПриватБанк API)
Чи потрібен окремий журнал на кожен рахунок, якщо банк один, а рахунків кілька? Так, для будь-якого способу підключення — журнал на кожен рахунок. Для файлових банків це очевидно: один файл — один рахунок, і для Аваля модуль додатково фільтрує рядки за номером рахунку журналу. Для API-банків з автовиявленням рахунків (Monobank Business, Укргазбанк) різниця лише в зручності: рахунок обирається зі списку, знайденого автоматично, а не вводиться вручну — але без вказаного фільтра рахунку в журналі транзакції з усіх виявлених рахунків компанії зіллються в один журнал. (Джерело: стаття про 5 файлових банків, стаття про три банківські API)
Чи створює повторний імпорт дублікати?
Ні. Базовий модуль kw_bank_statement додає до рядка виписки детермінований ключ дедуплікації з обмеженням SQL UNIQUE — при повторному імпорті того самого періоду створюються лише рядки з новим ключем, решта пропускається. (Джерело: лістинг Apps Store kw_bank_statement)
Деталі кожної інтеграції, вимоги до підключення і покрокові інструкції — у профільних статтях і на сторінках модулів в Apps Store за посиланнями вище.