Skip to content

Commit 02be1ae

Browse files
authored
Merge pull request #127 from omarkdev/fix/#122-recreate-renavam-validator
fix #122: Recreate Renavam rule
2 parents 9fc6563 + fbe4b36 commit 02be1ae

File tree

2 files changed

+111
-22
lines changed

2 files changed

+111
-22
lines changed

src/validator-docs/Rules/Renavam.php

Lines changed: 96 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,112 @@
66

77
class Renavam extends Sanitization
88
{
9+
/**
10+
* The renavam string size.
11+
*/
12+
protected const RENAVAM_SIZE = 11;
13+
14+
/**
15+
* Validate the renavam.
16+
*
17+
* @param $attribute
18+
* @param $renavam
19+
* @return bool
20+
*/
921
public function validateRenavam($attribute, $renavam): bool
1022
{
1123
$renavam = $this->sanitize((string) $renavam);
12-
$renavamArray = str_split($renavam);
13-
$digit = $this->determinarDigito($renavamArray);
24+
if (!$this->renavamHasCorrectLength($renavam)) {
25+
return false;
26+
}
27+
28+
$realLastDigit = $this->getRealLastDigit($renavam);
29+
$informedLastDigit = (int) substr($renavam, strlen($renavam) - 1, strlen($renavam));
30+
31+
return $realLastDigit === $informedLastDigit;
32+
}
33+
34+
35+
/**
36+
* Sanitize the renavam value.
37+
*
38+
* @param $value
39+
* @return string
40+
*/
41+
public function sanitize($value): string
42+
{
43+
$renavam = parent::sanitize((string) $value);
44+
if (preg_match("/^([0-9]{9})$/", $renavam)) {
45+
$renavam = '00' . $renavam;
46+
}
47+
48+
if (preg_match("/^([0-9]{10})$/", $renavam)) {
49+
$renavam = '0' . $renavam;
50+
}
51+
52+
return $renavam;
53+
}
54+
55+
/**
56+
* Check if renavam has correct length.
57+
*
58+
* @param string $renavam
59+
* @return bool
60+
*/
61+
protected function renavamHasCorrectLength(string $renavam): bool
62+
{
63+
return !!preg_match("/[0-9]{11}/", $renavam);
64+
}
65+
66+
/**
67+
* Get the real last digit calculated.
68+
*
69+
* @param string $renavam
70+
* @return int
71+
*/
72+
private function getRealLastDigit(string $renavam): int
73+
{
74+
$renavamReverseWithoutDigit = $this->sanitizeToReverseWithoutDigit($renavam);
75+
$sum = $this->calcSumByRenavamReverseWithoutDigit($renavamReverseWithoutDigit);
76+
77+
$mod11 = $sum % self::RENAVAM_SIZE;
78+
$lastDigitCalculated = self::RENAVAM_SIZE - $mod11;
79+
80+
return $lastDigitCalculated >= 10 ? 0 : $lastDigitCalculated;
81+
}
82+
83+
/**
84+
* Sanitize the renavam to without digit.
85+
*
86+
* @param string $renavam
87+
* @return string
88+
*/
89+
protected function sanitizeToReverseWithoutDigit(string $renavam): string
90+
{
91+
$renavamWithoutDigit = substr($renavam, 0, 10);
1492

15-
return $digit === (int) $renavamArray[4];
93+
return strrev($renavamWithoutDigit);
1694
}
1795

18-
public function determinarDigito($renavam): int
96+
/**
97+
* Calculate the sum value by renavam reverse without digit.
98+
*
99+
* @param string $renavamReverseWithoutDigit
100+
* @return int
101+
*/
102+
protected function calcSumByRenavamReverseWithoutDigit(string $renavamReverseWithoutDigit): int
19103
{
20-
$resultante = 0;
21-
$contador = 0;
104+
$sum = 0;
22105

23-
for ($indice = 5; $indice >= 2; $indice--) {
24-
$resultante += $renavam[$contador] * $indice;
25-
$contador++;
106+
for ($i = 0; $i < 8; $i++) {
107+
$numeral = (int) substr($renavamReverseWithoutDigit, $i, 1);
108+
$multiplier = $i + 2;
109+
$sum += $numeral * $multiplier;
26110
}
27111

28-
$verificador = $resultante % 11;
112+
$sum += $renavamReverseWithoutDigit[8] * 2;
113+
$sum += $renavamReverseWithoutDigit[9] * 3;
29114

30-
return $verificador >= 10 ? 0 : $verificador;
115+
return $sum;
31116
}
32117
}

tests/Rules/RenavamTest.php

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,24 @@ public function renavamValido($renavam, $esperado): void
1818

1919
$atual = $instance->validateRenavam('', $renavam);
2020

21-
$this->assertSame($esperado, $atual);
21+
$this->assertSame($esperado, $atual, $renavam);
2222
}
2323

2424
public function renavamProvider(): array
2525
{
26-
return [
27-
'Input correto' => [
28-
'renavam' => 639884962,
29-
'esperado' => true,
30-
],
31-
'Input incorreto' => [
32-
'renavam' => 11111111111,
33-
'esperado' => false
34-
],
35-
];
26+
$correctValues = [32094074362, 23478829239, 34145742746, 41833820181, 639884962];
27+
$wrongValues = [11111111111, 32094074212, 62128843267];
28+
29+
return array_reduce(
30+
array_merge($correctValues, $wrongValues),
31+
function ($acc, $value) use ($correctValues) {
32+
$key = "Renavam " . $value;
33+
$testProperties = ['renavam' => $value, 'esperado' => in_array($value, $correctValues)];
34+
35+
$acc[$key] = $testProperties;
36+
return $acc;
37+
},
38+
[]
39+
);
3640
}
3741
}

0 commit comments

Comments
 (0)