克罗地亚 2026 年电子发票规则迫使 PHP 开发人员重新设计验证逻辑 —— 税务局的 Schematron 文件依赖 XSLT 2.0,然而主流的 PHP XSLT 引擎仅支持 XSLT 1.0。结果是:大多数会计应用如果不采用变通方法,就无法运行那 62 项强制性的业务规则检查,而发票被拒可能会导致 B2B 现金流中断。

为什么这一技术障碍至关重要

从 2026 年 1 月 1 日起,克罗地亚的所有 B2B 交易都必须以符合 62 项特定验证规则的 e-Račun 形式进行交换。税务局将这些规则发布为 Schematron 文件 —— 本质上是一个用于标记违规行为的 XSLT 2.0 样式表。PHP 内置的 libxslt 库(为流行的 xsltproc 和大多数 Composer 包提供支持)仅实现了 XSLT 1.0。由于缺乏对 XSLT 2.0 的支持,Schematron 无法被应用,这意味着基于 PHP 的发票系统要么会生成被税务门户拒绝的发票,要么必须调用其他语言或服务。

开发人员可以采取的三种路径

选项 具体内容 实际缺点
SaxonC PECL 扩展 将 Saxon-C 处理器作为原生 PHP 扩展安装,然后直接调用 Schematron。 该扩展不属于典型的 Composer 工作流;在不同服务器上构建和部署原生二进制文件会增加复杂性。
外部验证服务 将 XML 发送到代表您运行 Schematron 的 Web 服务。 每张发票现在都依赖于网络延迟和服务可用性;暂时的停机可能会导致发票开具完全中断。
用 PHP 重新实现规则 将 62 项 Schematron 断言转换为原生 PHP 代码。 需要前期投入,但一旦编码完成,验证器即可在本地运行,与任何 PHP 技术栈无缝集成,并消除外部依赖。

导致简单实现失败的隐藏逻辑

对 Schematron 进行天真的翻译仍可能忽略微妙的语义。以规则 HR-BR-4 为例:“如果应付金额大于零,则必须存在到期日期。” Schematron 定义了一个变量,在处理贷记单(credit notes)时将发票金额乘以 -1。在原始 XML 中,贷记单显示为正金额,但该变量会将其翻转为负值,因此“大于零”的条件为假。如果验证器仅读取断言文本,它会拒绝所有的贷记单。

教训很明确:在编写相应的 PHP 条件之前,请务必阅读 Schematron 中的变量定义。同样的模式也出现在其他几个规则中,算术运算或字符串处理隐藏在 $ 变量之后。

常见的拒绝触发因素

即使规则编码正确,开发人员也经常忽略会被税务系统视为致命错误的某些发票元素:

  • 缺少运营商详情 —— 每张发票必须包含运营商的全名和 OIB(克罗地亚个人识别码)。任何一个字段留空都会立即导致拒绝。
  • 空的 XML 标签 —— 诸如 <cbc:Note></cbc:Note> 之类的标签会导致验证器崩溃。删除空元素或用占位符字符串填充它们可以解决此问题。
  • 错误的 KPD 代码 —— Klasifikacija proizvoda i usluga (KPD) 代码必须至少为六位数字。短代码会被标记为格式错误。
  • 无效日期 —— 任何日期早于 2026 年 1 月 1 日的发票都会违反强制日期规则,无论其他内容是否正确。

测试陷阱

税务局为开发人员发布了 e-Račun 示例文件。但这些示例仍包含 2025 年的日期和 OIB,无法通过 2026 年的规则集。将它们作为唯一的真理来源会给人一种合规的错觉。请将官方示例视为解析器的完整性检查,然后针对应用程序生成的真实数据运行您自己的规则执行套件。

已经面世的纯 PHP 解决方案

一位开发人员完成了重新实现的工作,将所有 62 项验证规则打包成一个适用于 Laravel 项目的 Composer 可安装库。该库处理了 Schematron 所隐藏的算术运算、变量作用域和边缘情况检查,从而允许完全在 PHP 运行时内进行发票验证。通过消除对 XSLT 2.0 和外部调用的需求,该包提供了一条确定性高、低延迟的合规路径。

源代码和使用指南可在作者的公共仓库中找到(链接见原帖)。

下一步关注点

  • 社区驱动的 PHP 验证器 – 随着越来越多的开发者采用重新实现的方法,可以预见会出现各种分支和扩展,例如增加单元测试 fixtures、支持其他框架或进行性能优化。

核心结论

克罗地亚 2026 年的电子发票强制令迫使 PHP 开发者必须面对现代 XSLT 2.0 Schematron 与该语言遗留的 XSLT 1.0 引擎之间的不匹配。通过将 62 条业务规则转换为原生 PHP、关注隐藏变量逻辑并规避常见的 XML 陷阱,可以实现发票处理的内部化,规避与网络相关的故障,并确保会计软件在截止日期到来时能够实现平稳、合规的上线。