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

Estados   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 81
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 34
c 1
b 0
f 0
dl 0
loc 81
ccs 28
cts 28
cp 1
rs 10
wmc 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
A searchEstados() 0 13 1
A obtain() 0 7 2
A findEstado() 0 11 2
A obtainEstadosByPais() 0 11 1
A createEstado() 0 9 1
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\Helpers\ScalarValues;
11
use PhpCfdi\SatCatalogos\Repository;
12
13
class Estados implements BaseCatalog
14
{
15
    use BaseCatalogTrait;
16
17 3
    public function obtain(string $codigo, string $pais): Estado
18
    {
19 3
        $estado = $this->findEstado($codigo, $pais);
20 3
        if (null === $estado) {
21 1
            throw new SatCatalogosNotFoundException("No se encontró un estado con código $codigo y país $pais");
22
        }
23 2
        return $estado;
24
    }
25
26 3
    public function findEstado(string $codigo, string $pais): ?Estado
27
    {
28
        $filters = [
29
            'estado' => $codigo,
30
            'pais' => $pais,
31
        ];
32 3
        $data = $this->repository()->queryRowsByFields(Repository::CFDI_40_ESTADOS, $filters);
33 3
        if (! isset($data[0])) {
34 1
            return null;
35
        }
36 2
        return $this->createEstado($data[0]);
37
    }
38
39
    /**
40
     * @param string $pais
41
     * @return Estado[]
42
     */
43 1
    public function obtainEstadosByPais(string $pais): array
44
    {
45
        $filters = [
46
            'pais' => $pais,
47
        ];
48
49 1
        return array_map(
50 1
            function (array $data): Estado {
51 1
                return $this->createEstado($data);
52
            },
53 1
            $this->repository()->queryRowsByFields(Repository::CFDI_40_ESTADOS, $filters),
54
        );
55
    }
56
57
    /**
58
     * @param string $texto
59
     * @param string $pais
60
     * @param string $codigo
61
     * @return Estado[]
62
     */
63 4
    public function searchEstados(string $texto = '%', string $pais = '%', string $codigo = '%'): array
64
    {
65
        $filters = [
66
            'estado' => $codigo,
67
            'pais' => $pais,
68
            'texto' => $texto,
69
        ];
70
71 4
        return array_map(
72 4
            function (array $data): Estado {
73 4
                return $this->createEstado($data);
74
            },
75 4
            $this->repository()->queryRowsByFields(Repository::CFDI_40_ESTADOS, $filters, 0, false),
76
        );
77
    }
78
79
    /**
80
     * Create a Estado based on the array values
81
     *
82
     * @param array<string, scalar> $data
83
     * @return Estado
84
     */
85 8
    public function createEstado(array $data): Estado
86
    {
87 8
        $values = new ScalarValues($data);
88 8
        return new Estado(
89 8
            $values->string('estado'),
90 8
            $values->string('pais'),
91 8
            $values->string('texto'),
92 8
            $values->timestamp('vigencia_desde'),
93 8
            $values->timestamp('vigencia_hasta'),
94
        );
95
    }
96
}
97