diff --git a/README.md b/README.md index 59b369c..d7978ea 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ This Symfony bundle provides validators for common scalar values: - [French SIREN value](/src/Validator/Constraints/FrenchSirenValidator.php) - [French SIRET value](/src/Validator/Constraints/FrenchSiretValidator.php) - [Dutch KVK number](/src/Validator/Constraints/DutchKvkNumberValidator.php) +- [Italian Fiscal Code](/src/Validator/Constraints/ItalianFiscalCodeValidator.php) See the different constraints source code for available options. diff --git a/src/Validator/Constraints/ItalianFiscalCode.php b/src/Validator/Constraints/ItalianFiscalCode.php new file mode 100644 index 0000000..fc42077 --- /dev/null +++ b/src/Validator/Constraints/ItalianFiscalCode.php @@ -0,0 +1,31 @@ +|null $groups + */ + #[HasNamedArguments] + public function __construct( + ?string $message = null, + ?array $groups = null, + mixed $payload = null, + ) { + parent::__construct( + message: $message ?? self::MESSAGE, + groups: $groups, + payload: $payload, + ); + } +} diff --git a/src/Validator/Constraints/ItalianFiscalCodeValidator.php b/src/Validator/Constraints/ItalianFiscalCodeValidator.php new file mode 100644 index 0000000..fa37f07 --- /dev/null +++ b/src/Validator/Constraints/ItalianFiscalCodeValidator.php @@ -0,0 +1,43 @@ +context->buildViolation($constraint->message) + ->setParameter('{{ value }}', $this->formatValue($value)) + ->setCode(ItalianFiscalCode::WRONG_FORMAT_ERROR) + ->addViolation(); + + return; + } + + parent::validate($value, $constraint); + } +} diff --git a/src/Validator/ConstraintsSetProvider/Field/ItalianFiscalCodeProvider.php b/src/Validator/ConstraintsSetProvider/Field/ItalianFiscalCodeProvider.php new file mode 100644 index 0000000..ea5979a --- /dev/null +++ b/src/Validator/ConstraintsSetProvider/Field/ItalianFiscalCodeProvider.php @@ -0,0 +1,23 @@ + + */ +class ItalianFiscalCodeValidatorTest extends ConstraintValidatorTestCase +{ + protected function getConstraint(): Constraint + { + return new ItalianFiscalCode(); + } + + public function createValidator(): ConstraintValidator + { + return new ItalianFiscalCodeValidator(); + } + + public static function providerValidValues(): iterable + { + yield 'null value' => [null]; + yield 'empty string' => ['']; + // Adyen documentation example + yield 'valid fiscal code' => ['00470400011']; + // Public Partita IVA example (same format and check digit as the fiscal code) + yield 'valid fiscal code of a company' => ['00159560366']; + // Public fiscal code of a non-commercial entity + yield 'valid fiscal code of a non-commercial entity' => ['80078750587']; + } + + public static function providerInvalidValues(): iterable + { + $formatMessage = ItalianFiscalCode::MESSAGE; + $formatCode = ItalianFiscalCode::WRONG_FORMAT_ERROR; + + yield 'wrong type' => [42, $formatCode, $formatMessage]; + yield 'too short' => ['0047040001', $formatCode, $formatMessage]; + yield 'too long' => ['004704000110', $formatCode, $formatMessage]; + yield 'contains letters' => ['0047040001A', $formatCode, $formatMessage]; + yield 'contains spaces' => ['00470 00011', $formatCode, $formatMessage]; + yield '16-character personal codice fiscale' => ['RSSMRA85T10A562S', $formatCode, $formatMessage]; + yield 'wrong checksum' => ['00470400012', ItalianFiscalCode::CHECKSUM_FAILED_ERROR, $formatMessage]; + } +} diff --git a/tests/Validator/ConstraintsSetProvider/Field/ItalianFiscalCodeProviderTest.php b/tests/Validator/ConstraintsSetProvider/Field/ItalianFiscalCodeProviderTest.php new file mode 100644 index 0000000..ecc5674 --- /dev/null +++ b/tests/Validator/ConstraintsSetProvider/Field/ItalianFiscalCodeProviderTest.php @@ -0,0 +1,23 @@ + 'italianFiscalCode'], [new ItalianFiscalCode()]]; + } +}