Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
81 / 81
100.00% covered (success)
100.00%
10 / 10
CRAP
100.00% covered (success)
100.00%
1 / 1
BrazilianDocumentType
100.00% covered (success)
100.00%
81 / 81
100.00% covered (success)
100.00%
10 / 10
12
100.00% covered (success)
100.00%
1 / 1
 label
100.00% covered (success)
100.00%
25 / 25
100.00% covered (success)
100.00%
1 / 1
1
 mask
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 length
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 isPersonalDocument
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 isCompanyDocument
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isProfessionalDocument
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
1
 isCertificate
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 labelList
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toArray
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 toArrayWithLabels
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace DevToolbelt\Enums\Brazil;
6
7use DevToolbelt\Enums\EnumInterface;
8
9enum BrazilianDocumentType: string implements EnumInterface
10{
11    case CPF = 'CPF';
12    case CNPJ = 'CNPJ';
13    case RG = 'RG';
14    case CNH = 'CNH';
15    case CTPS = 'CTPS';
16    case PIS_PASEP = 'PIS_PASEP';
17    case TITULO_ELEITOR = 'TITULO_ELEITOR';
18    case PASSAPORTE = 'PASSAPORTE';
19    case CERTIDAO_NASCIMENTO = 'CERTIDAO_NASCIMENTO';
20    case CERTIDAO_CASAMENTO = 'CERTIDAO_CASAMENTO';
21    case CERTIDAO_OBITO = 'CERTIDAO_OBITO';
22    case RNE = 'RNE';
23    case CRNM = 'CRNM';
24    case CRM = 'CRM';
25    case OAB = 'OAB';
26    case CRO = 'CRO';
27    case CREA = 'CREA';
28    case CRC = 'CRC';
29    case CRF = 'CRF';
30    case COREN = 'COREN';
31    case CRP = 'CRP';
32    case CRECI = 'CRECI';
33    case CAU = 'CAU';
34
35    public function label(): string
36    {
37        return match ($this) {
38            self::CPF => 'Cadastro de Pessoa Física',
39            self::CNPJ => 'Cadastro Nacional da Pessoa Jurídica',
40            self::RG => 'Registro Geral',
41            self::CNH => 'Carteira Nacional de Habilitação',
42            self::CTPS => 'Carteira de Trabalho e Previdência Social',
43            self::PIS_PASEP => 'Programa de Integração Social / Programa de Formação do Patrimônio do Servidor Público',
44            self::TITULO_ELEITOR => 'Título de Eleitor',
45            self::PASSAPORTE => 'Passaporte',
46            self::CERTIDAO_NASCIMENTO => 'Certidão de Nascimento',
47            self::CERTIDAO_CASAMENTO => 'Certidão de Casamento',
48            self::CERTIDAO_OBITO => 'Certidão de Óbito',
49            self::RNE => 'Registro Nacional de Estrangeiro',
50            self::CRNM => 'Carteira de Registro Nacional Migratório',
51            self::CRM => 'Conselho Regional de Medicina',
52            self::OAB => 'Ordem dos Advogados do Brasil',
53            self::CRO => 'Conselho Regional de Odontologia',
54            self::CREA => 'Conselho Regional de Engenharia e Agronomia',
55            self::CRC => 'Conselho Regional de Contabilidade',
56            self::CRF => 'Conselho Regional de Farmácia',
57            self::COREN => 'Conselho Regional de Enfermagem',
58            self::CRP => 'Conselho Regional de Psicologia',
59            self::CRECI => 'Conselho Regional de Corretores de Imóveis',
60            self::CAU => 'Conselho de Arquitetura e Urbanismo',
61        };
62    }
63
64    public function mask(): ?string
65    {
66        return match ($this) {
67            self::CPF => '###.###.###-##',
68            self::CNPJ => '##.###.###/####-##',
69            self::CNH => '###########',
70            self::PIS_PASEP => '###.#####.##-#',
71            self::TITULO_ELEITOR => '####.####.####',
72            default => null,
73        };
74    }
75
76    public function length(): ?int
77    {
78        return match ($this) {
79            self::CPF => 11,
80            self::CNPJ => 14,
81            self::CNH => 11,
82            self::PIS_PASEP => 11,
83            self::TITULO_ELEITOR => 12,
84            default => null,
85        };
86    }
87
88    public function isPersonalDocument(): bool
89    {
90        return in_array($this, [
91            self::CPF,
92            self::RG,
93            self::CNH,
94            self::CTPS,
95            self::PIS_PASEP,
96            self::TITULO_ELEITOR,
97            self::PASSAPORTE,
98            self::CERTIDAO_NASCIMENTO,
99            self::CERTIDAO_CASAMENTO,
100            self::RNE,
101            self::CRNM,
102        ], true);
103    }
104
105    public function isCompanyDocument(): bool
106    {
107        return $this === self::CNPJ;
108    }
109
110    public function isProfessionalDocument(): bool
111    {
112        return in_array($this, [
113            self::CRM,
114            self::OAB,
115            self::CRO,
116            self::CREA,
117            self::CRC,
118            self::CRF,
119            self::COREN,
120            self::CRP,
121            self::CRECI,
122            self::CAU,
123        ], true);
124    }
125
126    public function isCertificate(): bool
127    {
128        return in_array($this, [
129            self::CERTIDAO_NASCIMENTO,
130            self::CERTIDAO_CASAMENTO,
131            self::CERTIDAO_OBITO,
132        ], true);
133    }
134
135    /**
136     * @return string[]
137     */
138    public function labelList(): array
139    {
140        return array_map(fn (self $case) => $case->label(), self::cases());
141    }
142
143    /**
144     * @return array<string, string>
145     */
146    public static function toArray(): array
147    {
148        $result = [];
149
150        foreach (self::cases() as $document) {
151            $result[$document->value] = $document->value;
152        }
153
154        return $result;
155    }
156
157    /**
158     * @return array<string, string>
159     */
160    public static function toArrayWithLabels(): array
161    {
162        $result = [];
163
164        foreach (self::cases() as $document) {
165            $result[$document->value] = $document->label();
166        }
167
168        return $result;
169    }
170}