跳转到主要内容

使用invoice2data库导入供应商发票

项目描述

Beta License: AGPL-3 OCA/edi Translate me on Weblate Try me on Runboat

此模块是account_invoice_import模块的扩展:它增加了对常规PDF发票的支持,即没有嵌入XML文件的PDF发票。它使用invoice2data库,该库负责提取PDF发票的文本,找到现有的发票模板并执行发票模板以提取发票中的有用信息。

要了解此模块开发的全部故事,请阅读这篇博客文章

有关创建模板的更多信息,请参阅invoice2data库教程。模板需要手动创建。Odoo的图形模板创建器正在开发中。

警告:2021年7月开发的替代模块account_invoice_import_simple_pdf提供类似的功能,但有一个很大的优势:会计人员可以自己添加对新供应商的支持,不再需要需要技术技能的发票模板。模块account_invoice_import_simple_pdf提供基本功能,但不支持行级会计。

目录

安装

此模块需要Python库invoice2data,可在GitHub上找到,版本>= 0.2.74(2018年2月)。

要安装此库的最新版本,请运行

sudo pip3 install --upgrade invoice2data

如果您使用的是 Ubuntu 16.04 LTS 或更高版本,您可以使用发行版中打包的 pdftotext 版本 0.41.0

sudo apt install poppler-utils

如果您希望 invoice2data 库支持混合类型的 PDF 或在 PDF 不包含文本时回退到 OCR(只有极少数的 PDF 发票是基于图像的且需要 OCR,例如扫描的收据),您还应该安装 Ocrmypdf

pip install -U ocrmypdf

如果您希望 invoice2data 库在 PDF 不包含文本时回退到 OCR(只有极少数的 PDF 发票是基于图像的且需要 OCR,例如扫描的收据),您还应该安装 Imagemagick(以获取 convert 工具将 PDF 转换为 TIFF)和 Tesseract OCR

sudo apt install imagemagick tesseract-ocr

如果您想为 invoice2data 库使用自定义发票模板(除了 invoice2data 库提供的模板外),您应该在您的 Odoo 服务器配置文件中添加一行,例如

invoice2data_templates_dir = /opt/invoice2data_local_templates

并将您的发票模板存储为 YAML 格式(.yml 扩展名)或 json 格式在您配置的目录中。如果您在此目录中添加发票模板,无需重新启动 Odoo,它们将在下一次发票导入时自动使用。

如果您只想使用您自定义的发票模板并忽略 invoice2data 库提供的模板,您应该在您的 Odoo 服务器配置文件中包含以下内容

invoice2data_templates_dir = /opt/invoice2data_local_templates
invoice2data_exclude_built_in_templates = True

yaml 模板使用 [pyyaml](https://github.com/yaml/pyyaml) 加载,这是一个纯 Python 实现。(因此速度较慢)作为替代,可以使用 json 模板。这些模板在 Python 中得到原生更好的支持。使用 [libyaml](https://github.com/yaml/libyaml) 可以将 yaml 模板的性能提高 10 倍。它可以通过以下方式在大多数发行版中安装

sudo apt-get libyaml-dev

法语用户还应该安装来自 法国本地化 的模块 l10n_fr_business_document_import。荷兰用户还应该安装来自 荷兰本地化 的模块 l10n_nl_business_document_import

依赖项

名称 | 要求 | 安装 | 描述 |
————– | :———: | :———: | :————————————– |
[invoice2data](https://github.com/invoice-x/invoice2data) | required | pip install invoice2data | 此发票导入模块的主要依赖项 |
[poppler-utils](https://poppler.freedesktop.org/) | required | apt install poppler-utils | invoice2data 库的默认输入读取器 |
[dateparser](https://dateparser.readthedocs.io/en/latest/#) | required | pip install dateparser | 解析发票日期的要求,此要求可能已被 odoo 本身满足 |
[libyaml](https://github.com/yaml/libyaml) | optional | apt install libyaml-dev | 模板加载器,建议大大提高 yaml 模板的加载速度 |
[imagemagick](https://imagemagick.org.cn) | optional | apt install imagemagick | 输入读取器:在将 PDF 传递给 tesseract-ocr 之前预处理 PDF |
[tesseract-ocr](https://github.com/tesseract-ocr/tesseract) | optional | apt install tesseract-ocr | 输入读取器:仅用于图像 PDF 文件的 OCR |
[tesseract-ocr- lang](https://tesseract-ocr.cn/tessdoc/Data-Files-in-different-versions.html) | optional | apt install tesseract-ocr- see documentation | 输入读取器:tesseract ocr 的语言包,极大地提高了字符检测能力 |
https://github.com/ocrmypdf/OCRmyPDF | 可选 | apt install ocrmypdf | 输入读取器:仅适用于图像或混合类型的PDF文件。它底层使用tesseract-ocr,但提供了优化,大大提高了结果 |

配置

转到供应商的表单视图,并使用以下参数进行配置

  • 增值税已设置(在Odoo合作伙伴数据库中搜索供应商时默认使用增值税号)

  • 发票选项卡中,创建一个发票导入配置

对于供应商的PDF发票,如果没有嵌入XML文件,您需要在invoice2data Python库中创建一个模板文件,格式为YAML。这相当简单;如果您熟悉regexp,每个供应商不应超过10分钟。

以下是一些帮助您为供应商添加模板的建议

  • 在invoice2data库的仓库中有教程

  • Free SAS模板文件为例。您可以在invoice2data/test/pdf/invoice_free_fiber_201507.pdf下找到该供应商的示例PDF发票

  • 尝试在Free的样本发票上手动运行invoice2data库

% python -m invoice2data.main --debug invoice2data/test/pdf/invoice_free_fiber_201507.pdf

在输出中,您将首先得到PDF文本,然后是解析发票和正则表达式的调试信息,最后一行将包含解析结果的字典。

  • 如果供应商的增值税号出现在PDF发票的文本中,我认为将其用作关键字是个好主意。添加2个其他关键字是良好的实践:一个用于语言(例如,匹配发票的语言中的单词Invoice)和一个用于货币,以匹配特定语言和货币的该供应商的发票。

  • 字段列表应包含以下条目

    • ‘vat’带有供应商的增值税号(如果供应商的增值税号不在PDF文件中,添加‘partner_name’键)

    • ‘amount’(‘amount’是含税的总金额)

    • ‘amount_untaxed’或‘amount_tax’(一个或另一个,不需要两个)

    • ‘date’:发票日期

    • ‘invoice_number’

    • 如果PDF文件中有此信息,则包含‘date_due’

invoice2data库功能强大。它支持多种输入方法(pdftotext、ocrmypdf、tesseract ocr、google cloud vision)。甚至发票行也可以导入并映射到数据库中的产品。invoice2data库对字段名称没有严格的标准。这使得模块非常灵活,但也难以创建可重用的模板。

如果您想使用高级功能,已实现了以下字段的支持。

## 支持的字段

(注意:字段名列包含在模板文件中使用的名称。)

合作伙伴字段 | 字段名 | 类型 | 描述 | | ————– | :———: | :————————————– | | vat | char | 每个合作伙伴的增值税代码是唯一的,它在匹配合作伙伴时具有最高优先级 | | partner_name | char | 自解释 | | partner_street | char | 自解释 | | partner_street2 | char | 自解释 | | partner_street3 | char | 自解释 | | partner_city | char | 自解释 | | partner_zip | char | 自解释 | | country_code | char | 使用ISO格式fr或nl | | state_code | char | 使用ISO格式NY(纽约) | | partner_email | char | 自解释 | | partner_website | char | 自解释 | | telephone | char | 可以在支持模块的帮助下用于匹配合作伙伴 | | mobile | char | 可以在支持模块的帮助下用于匹配合作伙伴联系信息 | | partner_ref | char | 参考名称或编号可以用于合作伙伴匹配 | | siren | char | 法国企业代码,可以用于匹配合作伙伴 | | partner_coc | char | 一般商业识别号,可以用于匹配合作伙伴 |

发票字段(在文档级别) | 字段名 | 类型 | 描述 | | ————– | :———: | :————————————– | | currency | char | 发票的货币,ISO格式(EUR,USD) | | currency_symbol | char | 发票的货币符号(€,$) | | bic | char | 银行标识码 | | iban | char | 国际银行账户号码 | | amount | float | 发票的总金额(包括税费) | | amount_untaxed | float | 发票的总金额(不包括税费) | | amount_tax | float | 发票税费总额 | | date | date | 发票日期 | | invoice_number | char | 自解释 | | date_due | date | 发票到期日 | | date_start | date | 服务提供期间的开始日期 | | date_end | date | 服务提供期间的结束日期 | | note | char | 此字段的内容将被导入到聊天中。 | | narration | char | 此字段的内容将被导入到说明字段。(在发票底部。) | | payment_reference | char | 如果发票是预付费的,可以使用参考信息进行付款对账 | | payment_unece_code | char | 根据UN/CEFACT 4461代码列表的支付方式UN/CEFACT代码 | | incoterm | char | Incoterm 2000缩写 | | company_vat | char | 发票地址公司的增值税号。用于检查发票是否实际发送给想要处理的公司。(在多公司设置中非常有用。) | | mandate_id | char | 银行授权与银行账户相关联,代表银行账户所有者给予公司特定操作(如直接借记)的授权。 |

发票行字段 | 字段名 | 类型 | 描述 | | ————– | :———: | :————————————– | | name | char | 产品名称,可用于产品匹配 | | barcode | char | 产品或产品包装的条形码,用于产品匹配 | | code | char | (内部)产品代码,用于产品匹配 | | qty | float | 项目/单位的数量 | | unece_code | char | 可传递的产品单位计量unece代码 | | uom | char | 计量单位的名称,在内部将映射到unece代码。例如L将被映射到unece_code LTR | | price_unit | float | 项目的单价。(不含税) | | discount | float | 此行的折扣金额。例如20表示20%的折扣或0.0表示无折扣 | | price_total | float | 包含税的发票行总金额。可用于选择正确的税标签。 | | price_subtotal | float | 不含税的发票行总金额。可用于创建调整行,当小数精度不足时。 | | line_tax_percent | float | 税率百分比 | | line_tax_amount | float | 应用到行的固定税额 | | line_note | char | 可导入的发票备注,有一个特殊视图可用。 | | sectionheader | char | 有一个特殊视图可用用于部分标题。 | | date_start | date | 发票服务提供期间的开始日期 | | date_end | date | 发票服务提供期间的开始日期 |

已知问题/路线图

  • 实现支持包含所有税费的行,用于瑞士或扫描收据等一些本地化。

  • 图形模板构建器。

已知问题 * 输入模块硬编码为使用pdftotext解析器,并作为备用使用tesseract。 * 模板的创建仍然相当困难。 * 解析地址和公司特定字段。这意味着可以导入一张发给你公司的发票!

变更日志

14.0.2.2.0 (2023-03-03)

  • [新增] 对发票行的支持。(#74

错误跟踪器

错误在GitHub问题上跟踪。如果在那里找不到您的问题,请检查。如果是您首先发现的问题,请提供详细且受欢迎的反馈,以帮助我们解决问题。

请不要直接联系贡献者关于支持或技术问题的帮助。

致谢

作者

  • Akretion

贡献者

维护者

此模块由OCA维护。

Odoo Community Association

OCA,或Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。

当前维护者

alexis-via bosd

此模块是GitHub上OCA/edi项目的一部分。

欢迎您做出贡献。要了解如何做,请访问https://odoo-community.org/page/Contribute

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

此版本没有可用的源代码分发文件。请参阅生成分发存档的教程

构建分发

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面