クロアチアの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のスタイルシートである。人気のxsltprocやほとんどのComposerパッケージを支えるPHP内蔵のlibxsltライブラリは、XSLT 1.0のみを実装している。XSLT 2.0のサポートがなければSchematronを適用できず、PHPベースの請求システムは、税務ポータルに拒否される請求書を作成するか、あるいは別の言語やサービスを呼び出す必要が生じる。
開発者が取れる3つの道
| 選択肢 | 内容 | 実用上のデメリット |
|---|---|---|
| SaxonC PECL拡張 | Saxon-CプロセッサをネイティブのPHP拡張としてインストールし、Schematronを直接呼び出す。 | この拡張は一般的なComposerのワークフローには含まれておらず、異なるサーバー間でネイティブバイナリをビルド・デプロイする手間が複雑さを増す。 |
| 外部バリデーションサービス | XMLをウェブサービスに送信し、代わりにSchematronを実行してもらう。 | すべての請求書がネットワークのレイテンシやサービスの可用性に依存することになり、一時的な停止が請求業務全体を止める可能性がある。 |
| PHPでルールを再実装する | 62のSchematronアサーションをネイティブのPHPコードに変換する。 | 事前の工数は必要だが、一度コード化すればバリデーターはローカルで動作し、あらゆるPHPスタックとスムーズに統合でき、外部依存関係を排除できる。 |
単純な実装を陥らせる隠れたロジック
Schematronを単純に翻訳するだけでは、微妙な意味論を見落とす可能性がある。ルール HR-BR-4 を例に挙げよう:「支払額がゼロより大きい場合、支払期日が存在しなければならない。」 Schematronでは、クレジットノート(赤伝票)の場合に請求額に –1 を掛ける変数が定義されている。生のXMLではクレジットノートは正の金額を表示するが、変数がそれを負に反転させるため、「0より大きい」という条件は偽となる。バリデーターがアサーションのテキストのみを読み取っている場合、すべてのクレジットノートを拒否してしまう。
教訓は明白だ。対応するPHPの条件をコーディングする前に、Schematron内の変数定義を読み込むことである。同じパターンは、算術演算や文字列操作が $ 変数の背後に隠れている他のいくつかのルールにも見られる。
よくある拒否のトリガー
ルールが正しくコーディングされていても、開発者は税務システムが致命的なエラーとして扱う請求書要素を見落としがちである:
- 事業者情報の不足 – すべての請求書には、事業者の氏名(名称)とOIB(クロアチアの個人識別番号)が含まれていなければならない。どちらかのフィールドが空の場合、即座に拒否される。
- 空のXMLタグ –
<cbc:Note></cbc:Note>のようなタグは、バリデーターをクラッシュさせる原因となる。空の要素を削除するか、プレースホルダー文字列で埋めることで解決できる。 - 不正確なKPDコード – Klasifikacija proizvoda i usluga (KPD) コードは少なくとも6桁である必要がある。桁数が足りないコードは不正な形式としてフラグが立てられる。
- 無効な日付 – 他の正確性に関わらず、2026年1月1日より前の日付の請求書は、必須日付ルールに抵触する。
テストの落とし穴
税務当局は開発者向けにe-Računのサンプルファイルを公開している。しかし、それらの例には依然として2025年の日付や、2026年のルールセットを通過しないOIBが含まれている。それらを唯一の正解として扱うと、コンプライアンスを満たしているという誤った安心感を与えてしまう。公式サンプルはパーサーのサニティチェックとして扱い、アプリケーションが生成した現実的なデータに対して、独自のルール適用スイートを実行すべきである。
すでに実用化されているPHPのみのソリューション
ある開発者は再実装の道を進み、62個すべてのバリデーションルールをLaravelプロジェクト向けのComposerインストール可能なライブラリとしてパッケージ化した。このライブラリは、Schematronが隠蔽している算術演算、変数のスコープ、およびエッジケースのチェックを処理し、PHPのランタイム内だけで完全に請求書をバリデーションできるようにする。XSLT 2.0や外部呼び出しを排除することで、このパッケージは確定的で低レイテンシなコンプライアンスへの道を提供する。
ソースコードと使用ガイドは、著者の公開リポジトリ(リンクは元の投稿に記載)で入手可能である。
次に注目すべきこと
- コミュニティ主導のPHPバリデーター – より多くの開発者が再実装のアプローチを採用するにつれて、ユニットテストのフィクスチャ、他のフレームワークへの対応、またはパフォーマンスの微調整を追加するフォークや拡張機能が登場することが期待されます。
結論
クロアチアの2026年電子請求書義務化により、PHP開発者はモダンなXSLT 2.0 Schematronと、言語のレガシーなXSLT 1.0エンジンとの間の不一致に直面せざるを得なくなります。62のビジネスルールをネイティブなPHPに変換し、隠れた変数ロジックを注視し、一般的なXMLの落とし穴を避けることで、請求処理をインハウスで完結させ、ネットワーク関連の障害を回避し、期限が到来した際に会計ソフトウェアがスムーズかつコンプライアンスを遵守した形で展開できるよう準備を整えることができます。
