Passed
Pull Request — master (#14)
by Carlos C
02:36
created

Colonias   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 60
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 25
c 1
b 0
f 0
dl 0
loc 60
ccs 21
cts 21
cp 1
rs 10
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A searchColonias() 0 13 1
A create() 0 6 1
A find() 0 11 2
A obtain() 0 9 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpCfdi\SatCatalogos\CFDI40;
6
7
use PhpCfdi\SatCatalogos\Common\BaseCatalog;
8
use PhpCfdi\SatCatalogos\Common\BaseCatalogTrait;
9
use PhpCfdi\SatCatalogos\Exceptions\SatCatalogosNotFoundException;
10
use PhpCfdi\SatCatalogos\Repository;
11
12
/**
13
 * Catálogo de Colonias
14
 */
15
class Colonias implements BaseCatalog
16
{
17
    use BaseCatalogTrait;
18
19 5
    public function obtain(string $colonia, string $codigoPostal): Colonia
20
    {
21 5
        $found = $this->find($colonia, $codigoPostal);
22 5
        if (null === $found) {
23 2
            throw new SatCatalogosNotFoundException(
24 2
                "No se encontró una colonia $colonia con código postal $codigoPostal"
25
            );
26
        }
27 3
        return $found;
28
    }
29
30 5
    public function find(string $colonia, string $codigoPostal): ?Colonia
31
    {
32
        /** @var array<array<string, scalar>> $data */
33 5
        $data = $this->repository()->queryRowsByFields(Repository::CFDI_40_COLONIAS, [
34
            'colonia' => $colonia,
35
            'codigo_postal' => $codigoPostal,
36
        ]);
37 5
        if (! isset($data[0])) {
38 2
            return null;
39
        }
40 3
        return $this->create($data[0]);
41
    }
42
43
    /**
44
     * @param string $colonia
45
     * @param string $codigoPostal
46
     * @param string $asentamiento
47
     * @return Colonia[]
48
     */
49 3
    public function searchColonias(string $colonia = '%', string $codigoPostal = '%', string $asentamiento = '%'): array
50
    {
51
        $filters = [
52
            'colonia' => $colonia,
53
            'codigo_postal' => $codigoPostal,
54
            'texto' => $asentamiento,
55
        ];
56
57 3
        return array_map(
58 3
            function (array $data): Colonia {
59 3
                return $this->create($data);
60
            },
61 3
            $this->repository()->queryRowsByFields(Repository::CFDI_40_COLONIAS, $filters, 0, false)
62
        );
63
    }
64
65
    /**
66
     * @param array<string, scalar> $data
67
     * @return Colonia
68
     */
69 7
    public function create(array $data): Colonia
70
    {
71 7
        return new Colonia(
72 7
            (string) $data['colonia'],
73 7
            (string) $data['codigo_postal'],
74 7
            (string) $data['texto'],
75
        );
76
    }
77
}
78