Test Failed
Pull Request — 1.x (#84)
by
unknown
05:27 queued 01:54
created

ValidImei::passes()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 5
eloc 13
c 2
b 0
f 1
nc 4
nop 2
dl 0
loc 23
rs 9.5222

1 Method

Rating   Name   Duplication   Size   Complexity  
A ValidImei::validate() 0 5 2
1
<?php
2
3
namespace Milwad\LaravelValidate\Rules;
4
5
use Closure;
6
use Illuminate\Contracts\Validation\ValidationRule;
0 ignored issues
show
Bug introduced by
The type Illuminate\Contracts\Validation\ValidationRule was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
7
8
class ValidImei implements ValidationRule
9
{
10
    /**
11
     * Check IMEI is valid.
12
     *
13
     * @param string $attribute
14
     * @param mixed $value
15
     * @param Closure $fail
16
     * @return void
17
     */
18
    public function validate(string $attribute, mixed $value, Closure $fail): void
19
    {
20
        if (! $this->isImeiValid($value)) {
21
22
            $fail('validate.imei')->translate();
23
        }
24
    }
25
26
    /**
27
     * Check if IMEI is valid
28
     *
29
     * @param mixed $value
30
     * @return bool
31
     */
32
    private function isImeiValid(mixed $value): bool
33
    {
34
        $imei = $value;
35
36
        if (strlen($imei) != 15 || ! ctype_digit($imei)) {
37
            return false;
38
        }
39
40
        $digits = str_split($imei); // Get digits
41
        $imei_last = array_pop($digits); // Remove last digit, and store it
0 ignored issues
show
Bug introduced by
It seems like $digits can also be of type true; however, parameter $array of array_pop() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

41
        $imei_last = array_pop(/** @scrutinizer ignore-type */ $digits); // Remove last digit, and store it
Loading history...
42
        $log = [];
43
44
        foreach ($digits as $key => $n) {
45
            if ($key & 1) {
46
                $double = str_split($n * 2); // Get double digits
47
                $n = array_sum($double); // Sum double digits
0 ignored issues
show
Bug introduced by
It seems like $double can also be of type true; however, parameter $array of array_sum() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

47
                $n = array_sum(/** @scrutinizer ignore-type */ $double); // Sum double digits
Loading history...
48
            }
49
50
            $log[] = $n; // Append log
51
        }
52
        $sum = array_sum($log) * 9; // Sum log & multiply by 9
53
54
        return substr($sum, -1) === $imei_last;
55
    }
56
}
57