Gtin::integer()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php declare(strict_types=1);
2
3
namespace JustSteveKing\GtinPHP;
4
5
class Gtin
6
{
7
    /**
8
     * Check the length of a GTIN to make sure it is between 8 and 14 characters long
9
     * @param mixed $value
10
     * @return bool
11
     */
12
    public static function length($value): bool
13
    {
14
        $value = (string) $value;
15
16
        if (\strlen($value) <= 7 || \strlen($value) >= 15) {
17
            return false;
18
        }
19
20
        return true;
21
    }
22
23
    /**
24
     * Check that the GTIN is an integer - simply performs an is_int
25
     * @param mixed $value
26
     * @return bool
27
     */
28
    public static function integer($value): bool
29
    {
30
        return is_int($value);
31
    }
32
33
    /**
34
     * Inspects a GTIN to make sure the algorithm matches
35
     * @param mixed $value
36
     * @return bool
37
     */
38
    public static function inspect($value): bool
39
    {
40
        $gtinString = (string) $value;
41
42
        $checkDigitArray = [];
43
        $gtinMath = [3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3];
44
        $modifier = 17 - (\strlen($gtinString) - 1); // First Digit in array
45
        $checkDigit = \substr($gtinString, -1); // Get the check digit
46
47
        $barcodeArray = \str_split($gtinString); // split gtin into an array
48
49
        $tempCheckDigit = 0;
0 ignored issues
show
Unused Code introduced by
The assignment to $tempCheckDigit is dead and can be removed.
Loading history...
50
        $tempCheckSum = 0;
51
52
        // Run through and put digits into multiplication table
53
        for ($i = 0; $i < (\strlen($gtinString) - 1); $i++) {
54
            $checkDigitArray[$modifier + $i] = $barcodeArray[$i];
55
        }
56
57
        // Calculate the sum of barcode digits
58
        for ($i = $modifier; $i < 17; $i++) {
59
            $tempCheckSum += ((int) $checkDigitArray[$i] * $gtinMath[$i]);
60
        }
61
62
        // Difference from rounded up to nearest 10 to final check digit calculation
63
        $tempCheckDigit = (int)(\ceil($tempCheckSum / 10) * 10) - $tempCheckSum;
64
65
        if ((int) $checkDigit !== $tempCheckDigit) {
66
            return false;
67
        }
68
69
        return true;
70
    }
71
72
    /**
73
     * Validates an entire GTIN
74
     * @param mixed $value
75
     * @return bool
76
     */
77
    public static function validate($value): bool
78
    {
79
        if (! Gtin::length($value)) {
80
            return false;
81
        }
82
83
        if (! Gtin::integer($value)) {
84
            return false;
85
        }
86
87
        if (! Gtin::inspect($value)) {
88
            return false;
89
        }
90
91
        return true;
92
    }
93
}
94