Видобуток API¶
Odoo надає послугу для автоматизації обробки документів типу рахунки-фактури, банківські виписки, витрати або резюме.
Сервіс сканує документи за допомогою механізму OCR, а потім використовує алгоритми на основі AI для вилучення полів, що цікавлять, таких як загальна сума, дата оплати або рядки рахунків для рахунків, початковий та кінцевий баланси, дата для банківських виписок, загальна сума, дата для витрат або ім’я, електронна пошта, номер телефону для резюме.
Ця послуга є платною. Кожна обробка документа коштуватиме вам один кредит з вашого облікового запису IAP для оцифрування документів. Більше інформації про облікові записи IAP можна знайти тут.
Ви можете використовувати цей сервіс безпосередньо в додатку для бухгалтерського обліку, витрат або рекрутингу або через API. API Extract, детально описаний у наступному розділі, дозволяє вам інтегрувати наш сервіс безпосередньо у ваші власні проекти.
Огляд¶
API вилучення використовує протокол JSON-RPC2; його кінцеві маршрути розташовані за адресою https://extract.api.odoo.com.
Версія¶
Версія API вилучення вказується в маршруті.
- Найновіші версії:
рахунки-фактури: 123
банківські виписки: 100
витрати: 132
заявник: 102
Потік¶
Послідовність дій однакова для кожного типу документа.
- Викличте /parse, щоб надіслати документи (один виклик для кожного документа). У разі успіху ви отримаєте
document_tokenу відповіді. - Потім вам доведеться регулярно опитувати /get_result, щоб отримати статус парсингу документа.Або ж ви можете надати
webhook_urlпід час виклику /parse, і ви отримаєте сповіщення (через POST-запит), коли результат буде готовий.
Для всіх них слід використовувати метод HTTP POST. Реалізацію повного циклу для рахунків-фактур на Python можна знайти тут, а токен для інтеграційного тестування надається в розділі інтеграційного тестування.
Розбір¶
Запит на оцифрування документа. Маршрут поверне document_token, який можна використовувати для отримання результату вашого запиту.
Маршрути¶
/api/extract/invoice/2/parse
/api/extract/bank_statement/1/parse
/api/extract/expense/2/parse
/api/extract/applicant/2/parse
Запит¶
jsonrpc(обов’язково)див. JSON-RPC2
method(обов’язково)див. JSON-RPC2
id(обов’язково)див. JSON-RPC2
paramsaccount_token(обов’язково)Токен облікового запису IAP, з якого будуть списані кредити. Кожен успішний виклик коштує один кредит.
version(обов’язково)Версія визначатиме формат ваших запитів та формат відповіді сервера. Вам слід використовувати найновіша доступна версія.
documents(обов’язково)Документ має бути наданий як рядок Base64 у кодуванні ASCII. Список має містити лише один документ. Це поле є списком лише з міркувань застарілих версій. Підтримувані формати: pdf, png та jpg.
dbuuid(необов’язково)Унікальний ідентифікатор бази даних Odoo.
webhook_url(необов’язково)Можна надати URL-адресу вебхука. Порожній POST-запит буде надіслано на адресу
webhook_url/document_token, коли результат буде готовий.user_infos(необов’язково)Інформація про особу, яка надсилає документ до служби вилучення. Це може бути клієнт або постачальник (залежно від
perspective). Ця інформація не є обов’язковою для роботи служби, але вона значно покращує якість результату.user_company_vat(необов’язковий)Номер платника ПДВ користувача.
user_company_name(необов’язково)Назва компанії користувача.
user_company_country_code(необов’язковий)Код країни користувача. Формат: ISO3166 alpha-2.
user_lang(необов’язковий)Мова користувача. Формат: language_code + _ + locale (наприклад, fr_FR, en_US).
user_email(необов’язково)Електронна адреса користувача.
purchase_order_regex(необов’язково)Регулярний вираз для ідентифікації замовлення на купівлю. Якщо не вказано, за замовчуванням використовуватиметься формат замовлення на купівлю Odoo.
perspective(необов’язково)Може бути
clientабоsupplier. Це поле корисне лише для рахунків-фактур.clientозначає, що надана інформація користувача стосується клієнта рахунку.supplierозначає, що вона пов’язана з постачальником. Якщо не вказано, буде використано значення клієнт.
{
"jsonrpc": "2.0",
"method": "call",
"params": {
"account_token": string,
"version": int,
"documents": [string],
"dbuuid": string,
"webhook_url": string,
"user_infos": {
"user_company_vat": string,
"user_company_name": string,
"user_company_country_code": string,
"user_lang": string,
"user_email": string,
"purchase_order_regex": string,
"perspective": string,
},
},
"id": string,
}
Примітка
Параметр user_infos необов’язковий, але він значно покращує якість результату, особливо для рахунків-фактур. Чим більше інформації ви можете надати, тим краще.
Відповідь¶
jsonrpcдив. JSON-RPC2
idдив. JSON-RPC2
resultstatusКод, що вказує на статус запиту. Див. таблицю нижче.
status_msgРядок, що містить докладні відомості про стан запиту.
document_tokenВідображати лише в разі успішного запиту.
status |
status_msg |
|---|---|
|
Успіх |
|
Непідтримувана версія |
|
Виникла помилка |
|
У вас недостатньо кредиту |
|
Непідтримуваний формат файлу |
|
Сервер зараз на технічному обслуговуванні, спробуйте пізніше. |
{
"jsonrpc": "2.0",
"id": string,
"result": {
"status": string,
"status_msg": string,
"document_token": string,
}
}
Примітка
API насправді не використовує схему помилок JSON-RPC. Натомість API має власну схему помилок, яка входить до успішного результату JSON-RPC.
Get results¶
Маршрути¶
/api/extract/invoice/2/get_result
/api/extract/bank_statement/1/get_result
/api/extract/expense/2/get_result
/api/extract/applicant/2/get_result
Запит¶
jsonrpc(обов’язково)див. JSON-RPC2
method(обов’язково)див. JSON-RPC2
id(обов’язково)див. JSON-RPC2
paramsversion(обов’язково)Версія має збігатися з версією, переданою в запит /parse.
document_token(обов’язковий)document_token, для якого потрібно отримати поточний стан парсингу.account_token(обов’язково)Токен облікового запису IAP, який було використано для надсилання документа.
{
"jsonrpc": "2.0",
"method": "call",
"params": {
"version": int,
"document_token": int,
"account_token": string,
},
"id": string,
}
Відповідь¶
Під час отримання результатів розбору виявлене поле значно варіюється залежно від типу документа. Кожна відповідь – це список словників, по одному для кожного документа. Ключі словника – це назва поля, а значення – це значення поля.
jsonrpcдив. JSON-RPC2
idдив. JSON-RPC2
resultstatusКод, що вказує на статус запиту. Див. таблицю нижче.
status_msgРядок, що містить докладні відомості про стан запиту.
resultsВідображати лише в разі успішного запиту.
full_text_annotationМістить необроблений повний результат OCR для документа.
status |
status_msg |
|---|---|
|
Успіх |
|
Непідтримувана версія |
|
Виникла помилка |
|
Сервер зараз на технічному обслуговуванні, спробуйте пізніше. |
|
Документ не знайдено |
|
Документ відхилено, оскільки він занадто малий |
|
Не вдалося отримати кількість сторінок PDF-файлу |
|
Не вдалося конвертувати PDF-файл у зображення |
|
PDF-файл захищено паролем |
|
Документ містить забагато сторінок |
{
"jsonrpc": "2.0",
"id": string,
"result": {
"status": string,
"status_msg": string,
"results": [
{
"full_text_annotation": string,
"feature_1_name": feature_1_result,
"feature_2_name": feature_2_result,
...
},
...
]
}
}
Загальні поля¶
feature_result¶
Кожне поле, яке нас цікавить, таке як загальна сума або термін виконання, також називається ознаками. Вичерпний перелік усіх вилучених ознак, пов’язаних із певним типом документа, можна знайти в розділах нижче.
Для кожної функції ми повертаємо список кандидатів і виділяємо кандидата, який, за прогнозами нашої моделі, найкраще підходить для функції.
selected_value(необов’язково)Найкращий кандидат на цю функцію.
selected_values(необов’язково)Найкращі кандидати на цю функцію.
candidates(необов’язково)Список усіх кандидатів на цю функцію, відсортованих за зменшенням показника достовірності.
"feature_name": {
"selected_value": candidate_12,
"candidates": [candidate_12, candidate_3, candidate_4, ...]
}
кандидат¶
Для кожного кандидата ми вказуємо його представництво та позицію в документі. Кандидати відсортовані в порядку зменшення придатності.
contentПредставлення кандидата.
coords[center_x, center_y, width, height, rotation_angle]. Розташування та розміри відносяться до розміру сторінки, а отже, між 0 і 1. Кут – це поворот за годинниковою стрілкою, виміряний у градусах.pageСторінка оригіналу документа, на якому знаходиться кандидат (починається з 0).
"candidate": [
{
"content": string|float,
"coords": [float, float, float, float, float],
"page": int
},
...
]
Рахунки¶
Рахунки-фактури є складними та можуть містити багато різних полів. У наступній таблиці наведено вичерпний перелік усіх полів, які ми можемо витягти з рахунку-фактури.
Назва функції |
Специфіка |
|---|---|
|
Він містить інформацію про виявлений код SWIFT (або BIC). Ключі:
Назва та місто присутні, лише якщо verified_bic має значення true. |
|
|
|
|
|
Залежно від значення perspective у user_infos, це буде номер платника ПДВ постачальника або клієнта. Якщо perspective є клієнтом, це буде номер платника ПДВ постачальника. Якщо це постачальник, це номер платника ПДВ клієнта. |
|
|
|
|
|
Використовує |
|
|
|
|
|
Формат : YYYY-MM-DD |
|
Те саме, що для |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
invoice_lines - це функція¶
Повертається у вигляді списку словників, де кожен словник представляє рядок рахунку-фактури.
"invoice_lines": [
{
"description": string,
"quantity": float,
"subtotal": float,
"total": float,
"taxes": list[float],
"total": float,
"unit_price": float
},
...
]
Виписки з банківського рахунку¶
У наступній таблиці наведено список усіх полів, які витягуються з банківських виписок.
Назва функції |
Специфіка |
|---|---|
|
|
|
|
|
|
bank_statement_lines - це функція¶
Повертається у вигляді списку словників, де кожен словник представляє рядок банківської виписки.
"bank_statement_lines": [
{
"amount": float,
"description": string,
"date": string,
},
...
]
Витрати¶
Витрати менш складні, ніж рахунки-фактури. У наступній таблиці наведено вичерпний перелік усіх полів, які ми можемо витягти зі звіту про витрати.
Назва функції |
Специфіка |
|---|---|
|
|
|
|
|
|
|
|
|
|
Заявник¶
Цей третій тип документа призначений для обробки резюме. У наступній таблиці наведено вичерпний перелік усіх полів, які ми можемо витягти з резюме.
Назва функції |
Специфіка |
|---|---|
|
|
|
|
|
|
|
|
Інтеграційне тестування¶
Ви можете протестувати свою інтеграцію, використовуючи integration_token як account_token у запиті /parse.
Використання цього токена переводить вас у тестовий режим і дозволяє імітувати весь процес без фактичного розбору документа та без стягнення плати в одному кредиті за кожен успішний розбір документа.
Єдині технічні відмінності в тестовому режимі полягають у тому, що документ, який ви надсилаєте, не аналізується системою, і відповідь, яку ви отримуєте від /get_result, є жорстко закодованою.
Реалізацію повного циклу для рахунків-фактур на Python можна знайти тут.