OpenPeppol Help Desk バグ登録 PEPPOL-23582: JP PINT 2025-Q4 の計算規則と Schematron 検証の不整合

Views: 5

1. OpenPeppol Help Desk へのバグ報告

OpenPeppol Help Desk に、次のバグ報告を登録しました。

PEPPOL-23582
JP PINT 2025-Q4 validation defect: Schematron does not appear to validate calculation rules defined in JP PINT BIS

今回の論点は、単なる改善要望ではありません。

JP PINT BIS 2025-Q4 の本文では、請求書金額、明細行金額、値引・チャージ金額、日本の消費税に関する計算規則が規定されています。しかし、公開されている JP PINT の Schematron ルールでは、それらの計算規則の一部が検証されていないように見えます。

BIS 本文で計算規則を規定しているのであれば、その規則に準拠しているかどうかを客観的に判定する Schematron ルールも整備されているべきです。そうでなければ、C1 や C2 は、メッセージが JP PINT BIS に適合しているかを機械的に確認できません。

2. 何が問題なのか

JP PINT では、文書合計や消費税額の一部については Schematron による検証があります。

たとえば、JP PINT には ALIGNED-IBRP-051-JP があり、税分類別の税額 IBT-117 が、課税対象額 IBT-116 と税率 IBT-119 から正しく計算されているかを検証しています[1]

しかし、このルールは次の計算を確認しているにすぎません。

IBT-117 = IBT-116 × IBT-119 / 100

つまり、報告された課税対象額 IBT-116 を前提として、税額 IBT-117 が正しいかを確認しています。

問題は、その前段階です。JP PINT BIS では、消費税の課税対象額 IBT-116 は、税分類コードと税率ごとに、明細行金額、文書レベルチャージ、文書レベル値引から集計されると説明されています[2]

IBT-116 =
sum of relevant IBT-131
+ relevant IBT-099
− relevant IBT-092
grouped by Tax category code and Tax rate

ところが、この IBT-116 自体が正しく集計されているかを検証する Schematron ルールは確認できませんでした。

そのため、次のような状態が起こり得ます。

  • IBT-117 は、報告された IBT-116 に対して正しく計算されている。

  • しかし、その IBT-116 自体が、該当する明細行、文書レベルチャージ、文書レベル値引から正しく集計されていない。

  • それでも、現在の検証ではエラーにならない可能性がある。

これは、日本の消費税にとって重要な問題です。日本の消費税では、税率ごとに課税対象額を集計し、その集計額に対して税額を計算し、丸めは税率ごとに一度だけ行う必要があります。したがって、税率ごとの課税対象額が正しいことは、税額計算の前提です。

3. BIS Billing 3.0 ではどうなっていたか

Peppol BIS Billing 3.0 では、この種の計算規則に対応する Schematron ルールが詳細に整備されていました。

たとえば、標準税率の VAT taxable amount については BR-S-08 があり、BT-116 が、該当する明細行金額 BT-131、文書レベルチャージ BT-99、文書レベル値引 BT-92 から正しく集計されているかを検証しています[3]

また、ゼロ税率についても BR-Z-08 があり、同様に VAT category taxable amount の集計整合性を検証しています[4]

明細行金額についても、BIS Billing 3.0 には PEPPOL-EN16931-R120 があり、次の計算に相当する検証を行っています[5]

Invoice line net amount =
Item net price / Item price base quantity × Invoiced quantity
+ Invoice line charge amount
− Invoice line allowance amount

値引・チャージ金額についても、PEPPOL-EN16931-R040 により、基準金額と割合から計算される金額の整合性を検証しています[6]

Allowance/charge amount =
Base amount × Percentage / 100

品目正味単価についても、PEPPOL-EN16931-R046 により、総単価から値引額を控除した結果と正味単価が一致するかを検証しています[7]

Item net price =
Item gross price − Item price discount

このように、BIS Billing 3.0 では、BIS 本文に記載された計算規則と Schematron ルールとの整合性が比較的詳細に確保されていました。

4. PINT 以降で何が中途半端になっているのか

PINT BIS 本文にも、明細行金額、品目正味単価、値引・チャージ金額の計算規則は記載されています[8]

しかし、少なくとも JP PINT 2025-Q4 の公開ルールを確認した限り、BIS Billing 3.0 で提供されていたような詳細な計算検証ルールが、PINT Shared rules または JP aligned rules として十分に引き継がれていないように見えます。

これは、仕様書本文と検証ルールの関係を曖昧にします。

BIS 本文で計算規則を規定しているにもかかわらず、Schematron がその計算規則を検証しない場合、実装者は次のような疑問に直面します。

  • BIS 本文の計算式は規範的要求なのか。

  • それとも説明用の参考式にすぎないのか。

  • Schematron に合格すれば、BIS に適合していると判断してよいのか。

  • どの計算規則が検証対象で、どの計算規則が検証対象外なのか。

この状態は、Peppol の相互運用性にとって望ましくありません。

Peppol では、C1 で送信前に検証し、C2 で受信時に検証し、C4 に対して適合したメッセージを届けることが重要です。ところが、BIS 本文にある計算規則が Schematron で検証されない場合、C1 も C2 も、メッセージが本当に BIS の計算規則に準拠しているかを客観的に判定できません。

5. なぜこれは改善要望ではなくバグなのか

今回の Help Desk への報告では、この点を明確にしました。

これは「こういう追加チェックがあると便利です」という改善要望ではありません。

BIS 本文で計算規則を規定しているにもかかわらず、公式の検証 artefact がその計算規則を検証していないように見える、という不整合です。

JP PINT の検証に合格したメッセージが、BIS 本文で規定された計算規則に準拠していない可能性があるならば、検証結果は「JP PINT BIS への適合性」を十分に保証していないことになります。

特に日本の消費税では、税率ごとの課税対象額の集計と、税額の一度だけの丸めが制度上重要です。この計算が検証されなければ、税額そのものが報告された課税対象額と整合していても、その課税対象額が誤っている可能性が残ります。

6. 丸めと許容範囲の扱い

計算検証を追加する場合には、単純な完全一致で判定してはいけません。

明細行金額の計算には基準数量による割り算が含まれます。また、値引・チャージ金額の計算には割合計算が含まれます。こうした計算では、丸め差が発生します。

BIS Billing 3.0 では、この問題に対応するために u:slack() 関数が使用されていました。たとえば、PEPPOL-EN16931-R120PEPPOL-EN16931-R040 では、厳密一致ではなく、許容範囲を用いた検証が行われています。

JP PINT でも、JPY 金額については、少なくとも次のような考え方が必要です。

abs(calculatedAmount - reportedAmount) < 1

これは「1円以下」ではなく、「1円未満」です。

abs(calculatedAmount - reportedAmount) <= 1

としてしまうと、1円の差まで許容することになります。日本円の金額計算として、これは本来の意味とは異なる可能性があります。

したがって、計算検証を追加する場合には、丸め差を正しく扱う tolerance の設計も、検証仕様の一部として必要です。

7. 必要な対応

今回のバグ報告では、少なくとも次の検証が JP PINT に必要であると指摘しました。

CT category taxable amount =
sum of relevant Invoice line net amounts
+ relevant Document level charge amounts
− relevant Document level allowance amounts
grouped by Tax category code and Tax rate
Invoice line net amount =
Item net price / Item price base quantity × Invoiced quantity
+ Invoice line charge amount
− Invoice line allowance amount
Item net price =
Item gross price − Item price discount
Allowance/charge amount =
Base amount × Percentage / 100

もちろん、これらのルール番号や実装方法は OpenPeppol 側で決めるべきものです。報告では、議論用に JP aligned rule の形式で ALIGNED-IBRP-054-JP 以降のような番号案も示しましたが、重要なのは番号ではありません。

重要なのは、BIS 本文で規定された計算規則について、適合性を客観的に判定できる検証ルールを完備することです。

8. おわりに

Peppol の価値は、単に XML メッセージを交換できることではありません。仕様書、意味モデル、syntax binding、検証ルールが一体となって、相互運用性を保証するところにあります。

BIS Billing 3.0 では、仕様書本文と Schematron 検証の整合性がかなり詳細に取られていました。PINT 以降でも、この原則は維持されるべきです。

BIS 本文で規定しているのであれば、その規定に準拠しているかを Schematron で客観的に判定できなければなりません。

JP PINT 2025-Q4 における今回の不整合は、日本の消費税計算という実務上重要な領域に関わります。したがって、単なる改善要望ではなく、JP PINT の適合性検証に関する不具合として扱われるべきだと考えます。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です