Completed
Push — master ( 73210d...396474 )
by Antonio Oertel
03:23 queued 31s
created

Cpf   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 85
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 1
Metric Value
wmc 9
c 4
b 0
f 1
lcom 1
cbo 2
dl 0
loc 85
ccs 21
cts 21
cp 1
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A validate() 0 9 3
A isValidCV() 0 12 3
A format() 0 4 1
A __toString() 0 4 1
1
<?php
2
3
namespace Brazanation\Documents;
4
5
use Brazanation\Documents\Exception\InvalidDocument as InvalidArgumentException;
6
7
final class Cpf implements DocumentInterface
8
{
9
    const LENGTH = 11;
10
11
    const LABEL = 'CPF';
12
13
    const REGEX = '/^([\d]{3})([\d]{3})([\d]{3})([\d]{2})$/';
14
15
    const FORMAT_REGEX = '/^[\d]{3}\.[\d]{3}\.[\d]{3}-[\d]{2}$/';
16
17
    /**
18
     * @var string
19
     */
20
    private $cpf;
21
22
    /**
23
     * Cpf constructor.
24
     *
25
     * @param string $number Only accept numbers
26
     */
27 11
    public function __construct($number)
28
    {
29 11
        $number = preg_replace('/\D/', '', $number);
30 11
        $this->validate($number);
31 4
        $this->cpf = $number;
32 4
    }
33
34
    /**
35
     * Check if CPF is not empty and is a valid number.
36
     *
37
     * @param string $number
38
     *
39
     * @throws InvalidArgumentException when CPF is empty
40
     * @throws InvalidArgumentException when CPF is not valid number
41
     */
42 11
    private function validate($number)
43
    {
44 11
        if (empty($number)) {
45 3
            throw InvalidArgumentException::notEmpty(static::LABEL);
46
        }
47 8
        if (!$this->isValidCV($number)) {
48 4
            throw InvalidArgumentException::isNotValid(static::LABEL, $number);
49
        }
50 4
    }
51
52
    /**
53
     * Validates cpf is a valid number.
54
     *
55
     * @param string $number A number to be validate.
56
     *
57
     * @return bool Returns true if it is a valid number, otherwise false.
58
     */
59 8
    private function isValidCV($number)
60
    {
61 8
        if (strlen($number) != static::LENGTH) {
62 1
            return false;
63
        }
64
65 7
        if (preg_match("/^{$number[0]}{" . static::LENGTH . '}$/', $number)) {
66 1
            return false;
67
        }
68
69 6
        return (new Modulo11(2, static::LENGTH))->validate($number);
70
    }
71
72
    /**
73
     * Formats CPF number
74
     *
75
     * @return string Returns formatted number, such as: 00.000.000/0000-00
76
     */
77 2
    public function format()
78
    {
79 2
        return preg_replace(static::REGEX, '$1.$2.$3-$4', $this->cpf);
80
    }
81
82
    /**
83
     * Returns the CPF number
84
     *
85
     * @return string
86
     */
87 2
    public function __toString()
88
    {
89 2
        return $this->cpf;
90
    }
91
}
92