From 6c006df2b9e7313e1e50bf87a38f8ba4ecc1a2ab Mon Sep 17 00:00:00 2001 From: Fabian Welzer Date: Wed, 21 Oct 2020 09:31:21 +0200 Subject: [PATCH] Add BG validation algorithm for foreign natural persons --- src/Vies/Validator/ValidatorBG.php | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Vies/Validator/ValidatorBG.php b/src/Vies/Validator/ValidatorBG.php index 7ad8ac5..1fb70e8 100644 --- a/src/Vies/Validator/ValidatorBG.php +++ b/src/Vies/Validator/ValidatorBG.php @@ -45,7 +45,8 @@ public function validate(string $vatNumber): bool } if (10 === $vatNumberLength) { - return $this->validateNaturalPerson($vatNumber); + return $this->validateNaturalPerson($vatNumber) + || $this->validateForeignNaturalPerson($vatNumber); } return $this->validateBusiness($vatNumber); } @@ -96,4 +97,28 @@ private function validateNaturalPerson(string $vatNumber): bool return $checkVal == (int) $vatNumber[9]; } + + /** + * Validate VAT ID's for foreign natural persons + * + * @param string $vatNumber + * @return bool + * @see https://github.com/yolk/valvat/blob/master/lib/valvat/checksum/bg.rb + */ + private function validateForeignNaturalPerson(string $vatNumber): bool + { + $weights = [21, 19, 17, 13, 11, 9, 7, 3, 1]; + $checkVal = $this->sumWeights($weights, $vatNumber); + + if ($checkVal % 11 == 10) { + $weights = [3, 4, 5, 6, 7, 8, 9, 10]; + $checkVal = $this->sumWeights($weights, $vatNumber); + + $checkVal = ($checkVal % 11) == 10 ? 0 : ($checkVal % 11); + } else { + $checkVal = $checkVal % 10; + } + + return $checkVal == (int) $vatNumber[9]; + } }