克罗地亚 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 陷阱,可以实现发票处理的内部化,规避与网络相关的故障,并确保会计软件在截止日期到来时能够实现平稳、合规的上线。
