【ITニュース解説】Validate Portuguese VAT Numbers (NIF) in Node.js
2026年09月28日に「Dev.to」が公開したITニュース「Validate Portuguese VAT Numbers (NIF) in Node.js」について初心者にもわかりやすく解説しています。
ITニュース概要
Node.jsでポルトガルのVAT番号(NIF)を検証する手順を解説。形式は「PT+9桁」で、モジュロ11チェックデジットで誤入力を検知する。登録確認にはEUのVIESシステムが必須。ポルトガルには代替検証源がないため、VIESが利用不可の場合、登録の真偽は判断できない。
ITニュース解説
ポルトガルのVAT番号、通称NIF(Número de Identificação Fiscal)は、企業や個人がポルトガル国内で税務上の識別に使われる9桁の番号だ。この番号は、EU圏内でビジネスを行う際の付加価値税(VAT)の取引でも重要になる。システムエンジニアにとって、このNIFを正確に検証する機能は、顧客の登録、請求書の作成、税務申告など、さまざまなシステムで必要となる。
ポルトガルのVAT番号の形式は非常にシンプルで、「PT」という国コードに続いて9桁の数字が並ぶ。例えば「PT512345678」のような形だ。他のEU加盟国の中には、企業登録番号とVAT専用番号を別々に持つ国もあるが、ポルトガルの場合はこの9桁のNIFが、銀行口座の開設、賃貸契約、そしてVAT登録に至るまで、あらゆる場面で同じように使われる。つまり、NIFはポルトガルの国民識別番号でもあり、VAT番号でもあるわけだ。
NIFと似た言葉にNIPC(Número de Identificação de Pessoa Coletiva)というものがあるが、これは実質的に同じ番号を指す。NIFが個人、個人事業主、企業、協会などあらゆる納税主体に割り当てられる包括的な税務番号であるのに対し、NIPCは特に法人(Pessoa Coletiva)に対して使われるラベルに過ぎない。番号そのものに違いはなく、数字だけを見てどちらのタイプか区別することはできない。ただし、ポルトガルの会計業界では、NIFの最初の桁がエンティティの種類を示唆するという慣習が存在する。例えば、1、2、3から始まる番号は個人、5は企業、8は個人事業主といった具合だ。しかし、これは税務当局が公式に定めた規則ではなく、あくまで慣習なので、システムでこの情報に基づいてNIFの有効性を判断するべきではない。
Node.jsのようなプログラミング環境でNIFを検証する際、最初のステップは入力された文字列のフォーマットを検証し、正規化することだ。ユーザーが入力する際には、スペースやハイフンなどの区切り文字が含まれることや、「PT」のプレフィックスを省略して9桁の数字だけを入力することがよくある。そのため、システムはこれらの入力パターンに対応できるように設計する必要がある。例えば、入力された文字列から不要な文字(スペース、ピリオド、ハイフンなど)を取り除き、すべて大文字に変換する処理が考えられる。もし「PT」プレフィックスがない9桁の数字だけが入力された場合は、「PT」を自動的に付加するような「寛容なモード」を用意すると、ユーザー体験が向上する。一方で、API連携などバックエンドの処理では、厳密に「PT」と9桁の数字の形式のみを受け付ける「厳格なモード」を採用することが望ましい。正規表現を用いることで、これらのフォーマットチェックを効率的に行える。しかし、このフォーマット検証は、あくまで文字列の形が正しいことを確認するだけであり、番号が実際に存在するか、登録されているかまでは証明できない点に注意が必要だ。
次のステップは、NIFの9桁目がチェックデジットとして算術的に正しいかを検証することだ。ポルトガルのNIFの9桁目は、最初の8桁の数字に基づいて計算される「Mod-11チェックサム」という方式で決定される。この計算は、最初の8桁の各数字に重み(左から9, 8, 7, 6, 5, 4, 3, 2)をかけて合計し、その合計を11で割った余り(Mod-11)からチェックデジットを導き出すものだ。例えば、計算の結果、余りが0か1の場合はチェックデジットは0となり、それ以外の場合は11から余りを引いた数がチェックデジットとなる。このチェックデジット検証は、ユーザーが入力ミスをした場合に、その場で間違いを検出できる強力な方法だ。これにより、誤ったNIFで不必要なネットワーク呼び出しを行うことを防げる。しかし、このチェックデジットが正しくても、そのNIFが実際に有効なものとして登録されているとは限らない。これはあくまで「タイプミスがないか」というローカルでの事前フィルタリングに過ぎない。
NIFが実際に登録されているかを検証するには、VIES(VAT Information Exchange System)と呼ばれるEUのシステムに問い合わせる必要がある。VIESは、EU加盟国の税務当局が持つVAT番号登録情報を相互に連携させるシステムだ。システムからVIESにポルトガルのNIFを問い合わせると、VIESはポルトガル税務当局に照会し、そのNIFが有効であるか、そしてその会社の名称や住所などの情報を返してくれる。このVIESによるオンラインチェックが、NIFの有効性を確認する上で最も信頼できる唯一の手段となる。
VIESによる検証において、ポルトガルには特別な注意点がある。他のEU加盟国では、VIESが一時的に利用できない場合(システムの障害など)に備えて、国内の代替税務当局システムや企業登録データベースにフォールバックして情報を取得できる場合がある。しかし、ポルトガルにおいては、現在そのような国内フォールバックの仕組みはvatnodeなどのサービスに組み込まれていない。つまり、VIESのポルトガルノードがダウンした場合、そのNIFの有効性を確認する代替手段が提供されないため、チェックは単なる「システム障害」という結果を返すことになる。また、VIESから返される情報に加えて、ポルトガルの企業登録情報などでNIFをさらに補強する「エンリッチメント」の仕組みも存在しない。このため、ポルトガルのNIFを扱うシステムでは、VIESの利用不可状態に適切に対処するエラーハンドリングが特に重要になる。
vatnodeのような専門のAPIサービスを利用すると、これらの複雑な検証プロセスを効率的に実現できる。vatnode APIは、入力されたNIFのフォーマット正規化、チェックデジット検証、そしてVIESへの問い合わせをすべて一つのリクエストで行う。API呼び出しでは、NIFが有効かどうか(validフィールド)、国コード、会社名、住所といった情報が返される。ただし、会社名や住所は常に返されるとは限らない点に留意すべきだ。また、sourceフィールドはポルトガルの場合常に「VIES」となり、registryCodeやregistryCodeNameといったフィールドはNIF自体をNIPCとしてラベル付けしたものに過ぎず、独立したデータソースから得られた追加情報ではないことを理解しておく必要がある。
エラーハンドリングは、ポルトガルのNIF検証において特に重要な側面だ。VIESが利用できない状況(VIES_UNAVAILABLE)は、NIFが「無効」であることとは明確に区別して扱う必要がある。NIFのフォーマットが不正(INVALID_FORMAT)であれば、それはユーザーの入力ミスであり、その場で訂正を促すべきだ。しかし、VIESが一時的にダウンしている場合は、NIF自体が間違っているわけではないため、直ちに「無効」と判断するのではなく、後で再度試行(リトライ)するようなロジックを実装する必要がある。このリトライ戦略には、急激な負荷をかけないよう、時間間隔を徐々に長くする「指数関数的バックオフ」などが効果的だ。ポルトガルにはVIESが利用できない場合のフォールバックがないため、VIESのダウンタイムに耐えられる堅牢なリトライ処理は、システムの安定稼働に不可欠となる。
結局のところ、ポルトガルのVAT番号検証は、まずローカルでフォーマットとチェックデジットを検証して入力ミスを防ぎ、次にVIESシステムに問い合わせて実際の登録状況を確認するという二段階のアプローチが最も信頼できる。そして、VIESが利用できない状況に備えた適切なエラーハンドリングとリトライ戦略を組み込むことが、システムエンジニアとしての重要な考慮点となる。これにより、ビジネスプロセスの信頼性を高め、国際的な取引をスムーズに進めることができる。