Validates the German Wirtschafts-ID (Wirtschafts-Identifikationsnummer)
Check digit (eleventh position in normalised form) is validated based on ISO/IEC 7064, MOD 11,10 as documented within the meanwhile repealed "Datenträger-Verordnung über die Abgabe Zusammenfassender Meldungen – ZMDV" dated 13.05.1993 (BGBl. I S. 736).
Note
This package validates solely the syntax and check digit of the provided input. It does not confirm, that the provided Wirtschafts-ID was assigned to an entity. Please consult BZSt, if in doubt. Some insight concerning validity might be concluded based on VIES.
You can install the package via composer:
composer require rechtlogisch/wirtschafts-id
isWirtschaftsIdValid('DE123456788'); // => true
or
use Rechtlogisch\WirtschaftsId\WirtschaftsId;
(new WirtschaftsId('DE123456788'))
->validate() // ValidationResult::class
->isValid(); // => true
This package supports both validation of the Wirtschafts-ID with and without the Unterscheidungsmerkmal. It is optional information after the eleventh character and separator. It consists of a hyphen and a five-digit number.
Note
Unterscheidungsmerkmal starts at 00001
and therefore 00000
is not valid.
Tip
At first all entities will receive a Wirtschafts-ID with the Unterscheidungsmerkmal -00001
. If needed, as of 2026 each economic activity (wirtschaftliche Tätigkeit) will receive a separate Unterscheidungsmerkmal, which will be incremented by one for each economic activity and linked to a tax number of the business or the permanent establishment within the responsible tax office.
Source: BZSt
Tip
Based on the form/dataset you might need to provide the Unterscheidungsmerkmal or not.
isWirtschaftsIdValid('DE123456788-00001'); // => true
or
use Rechtlogisch\WirtschaftsId\WirtschaftsId;
(new WirtschaftsId('DE123456788-00001'))
->validate() // ValidationResult::class
->isValid(); // => true
You can get a list of errors explaining why the provided input is invalid. The validate()
method returns a DTO with a getErrors()
method.
Note
The keys of getErrors()
hold the stringified reference to the exception class. You can check for a particular error by comparing to the ::class constant. For example: Rechtlogisch\WirtschaftsId\Exceptions\InvalidWirtschaftsIdWithoutUnterscheidungsmerkmalLength::class
.
validateWirtschaftsId('DE12345678')->getErrors();
// [
// 'Rechtlogisch\WirtschaftsId\Exceptions\InvalidWirtschaftsIdWithoutUnterscheidungsmerkmalLength'
// => 'Wirtschafts-ID must be 11 characters long. Provided Wirtschafts-ID is: 10 characters long.',
// ]
or
use Rechtlogisch\WirtschaftsId\WirtschaftsId;
(new WirtschaftsId('DE12345678'))
->validate()
->getErrors();
// [
// 'Rechtlogisch\WirtschaftsId\Exceptions\InvalidWirtschaftsIdWithoutUnterscheidungsmerkmalLength'
// => 'Wirtschafts-ID must be 11 characters long. Provided Wirtschafts-ID is: 10 characters long.',
// ]
You can get a list of hints explaining why the provided input is not plausible. Hints do not change the validation result. The validate()
method returns a DTO with a getHints()
method.
Note
The keys of getHints()
hold the stringified reference to the exception class. You can check for a particular error by comparing to the ::class constant. For example: Rechtlogisch\WirtschaftsId\Exceptions\UnterscheidungsmerkmalShouldBe00001BeforeYear2026::class
.
validateWirtschaftsId('DE123456788-00002')->getHints();
// [
// 'Rechtlogisch\WirtschaftsId\Exceptions\UnterscheidungsmerkmalShouldBe00001BeforeYear2026'
// => 'Unterscheidungsmerkmal (after -) is typically "00001" before year 2026.',
// ]
Tip
You can of course use the alternative way of validation presented in the Usage section.
composer test
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
If you discover any security-related issues, please email [email protected] instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.