SatCatalogos   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Test Coverage

Coverage 80%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 77
c 4
b 0
f 0
dl 0
loc 118
ccs 16
cts 20
cp 0.8
rs 10
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A create() 0 13 4
A __call() 0 18 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpCfdi\SatCatalogos;
6
7
use LogicException;
8
use PhpCfdi\SatCatalogos\Common\BaseCatalog;
9
use PhpCfdi\SatCatalogos\Exceptions\SatCatalogosLogicException;
10
11
/**
12
 * Class SatCatalogos
13
 *
14
 * @method CFDI\Aduanas                   aduanas();
15
 * @method CFDI\ClavesUnidades            clavesUnidades();
16
 * @method CFDI\CodigosPostales           codigosPostales();
17
 * @method CFDI\FormasDePago              formasDePago();
18
 * @method CFDI\Impuestos                 impuestos();
19
 * @method CFDI\MetodosDePago             metodosDePago();
20
 * @method CFDI\Monedas                   monedas();
21
 * @method CFDI\NumerosPedimentoAduana    numerosPedimentoAduana();
22
 * @method CFDI\Paises                    paises();
23
 * @method CFDI\PatentesAduanales         patentesAduanales();
24
 * @method CFDI\ProductosServicios        productosServicios();
25
 * @method CFDI\RegimenesFiscales         regimenesFiscales();
26
 * @method CFDI\ReglasTasaCuota           reglasTasaCuota();
27
 * @method CFDI\TiposComprobantes         tiposComprobantes();
28
 * @method CFDI\TiposFactores             tiposFactores();
29
 * @method CFDI\TiposRelaciones           tiposRelaciones();
30
 * @method CFDI\UsosCfdi                  usosCfdi();
31
 *
32
 * @method CFDI40\Aduanas                 aduanas40();
33
 * @method CFDI40\ClavesUnidades          clavesUnidades40();
34
 * @method CFDI40\CodigosPostales         codigosPostales40();
35
 * @method CFDI40\Colonias                colonias40();
36
 * @method CFDI40\Estados                 estados40();
37
 * @method CFDI40\Exportaciones           exportaciones40();
38
 * @method CFDI40\FormasDePago            formasDePago40();
39
 * @method CFDI40\Impuestos               impuestos40();
40
 * @method CFDI40\Localidades             localidades40();
41
 * @method CFDI40\Meses                   meses40();
42
 * @method CFDI40\MetodosDePago           metodosDePago40();
43
 * @method CFDI40\Monedas                 monedas40();
44
 * @method CFDI40\Municipios              municipios40();
45
 * @method CFDI40\NumerosPedimentoAduana  numerosPedimentoAduana40();
46
 * @method CFDI40\ObjetosImpuestos        objetosImpuestos40();
47
 * @method CFDI40\Paises                  paises40();
48
 * @method CFDI40\PatentesAduanales       patentesAduanales40();
49
 * @method CFDI40\Periodicidades          periodicidades40();
50
 * @method CFDI40\ProductosServicios      productosServicios40();
51
 * @method CFDI40\RegimenesFiscales       regimenesFiscales40();
52
 * @method CFDI40\ReglasTasaCuota         reglasTasaCuota40();
53
 * @method CFDI40\TiposComprobantes       tiposComprobantes40();
54
 * @method CFDI40\TiposFactores           tiposFactores40();
55
 * @method CFDI40\TiposRelaciones         tiposRelaciones40();
56
 * @method CFDI40\UsosCfdi                usosCfdi40();
57
 *
58
 * @method Nomina\Bancos                  bancos();
59
 * @method Nomina\Estados                 estados();
60
 * @method Nomina\OrigenesRecursos        origenesRecursos();
61
 * @method Nomina\PeriodicidadesPagos     periodicidadesPagos();
62
 * @method Nomina\RiesgosPuestos          riesgosPuestos();
63
 * @method Nomina\TiposContratos          contratos();
64
 * @method Nomina\TiposDeducciones        deducciones();
65
 * @method Nomina\TiposHoras              horasExtras();
66
 * @method Nomina\TiposIncapacidades      incapacidades();
67
 * @method Nomina\TiposJornadas           jornadas();
68
 * @method Nomina\TiposNominas            nominas();
69
 * @method Nomina\TiposOtrosPagos         otrosTipoPago();
70
 * @method Nomina\TiposPercepciones       percepciones();
71
 * @method Nomina\TiposRegimenes          regimenesContratacion();
72
 */
73
class SatCatalogos
74
{
75
    /** @var array<string, class-string|BaseCatalog> */
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<string, class-string|BaseCatalog> at position 4 could not be parsed: Unknown type name 'class-string' at position 4 in array<string, class-string|BaseCatalog>.
Loading history...
76
    private $map = [
77
        // CFDI
78
        'aduanas' => CFDI\Aduanas::class,
79
        'clavesUnidades' => CFDI\ClavesUnidades::class,
80
        'codigosPostales' => CFDI\CodigosPostales::class,
81
        'formasDePago' => CFDI\FormasDePago::class,
82
        'impuestos' => CFDI\Impuestos::class,
83
        'metodosDePago' => CFDI\MetodosDePago::class,
84
        'monedas' => CFDI\Monedas::class,
85
        'numerosPedimentoAduana' => CFDI\NumerosPedimentoAduana::class,
86
        'paises' => CFDI\Paises::class,
87
        'patentesAduanales' => CFDI\PatentesAduanales::class,
88
        'productosServicios' => CFDI\ProductosServicios::class,
89
        'regimenesFiscales' => CFDI\RegimenesFiscales::class,
90
        'reglasTasaCuota' => CFDI\ReglasTasaCuota::class,
91
        'tiposComprobantes' => CFDI\TiposComprobantes::class,
92
        'tiposFactores' => CFDI\TiposFactores::class,
93
        'tiposRelaciones' => CFDI\TiposRelaciones::class,
94
        'usosCfdi' => CFDI\UsosCfdi::class,
95
        // CFDI40
96
        'aduanas40' => CFDI40\Aduanas::class,
97
        'clavesUnidades40' => CFDI40\ClavesUnidades::class,
98
        'codigosPostales40' => CFDI40\CodigosPostales::class,
99
        'colonias40' => CFDI40\Colonias::class,
100
        'estados40' => CFDI40\Estados::class,
101
        'exportaciones40' => CFDI40\Exportaciones::class,
102
        'formasDePago40' => CFDI40\FormasDePago::class,
103
        'impuestos40' => CFDI40\Impuestos::class,
104
        'localidades40' => CFDI40\Localidades::class,
105
        'meses40' => CFDI40\Meses::class,
106
        'metodosDePago40' => CFDI40\MetodosDePago::class,
107
        'monedas40' => CFDI40\Monedas::class,
108
        'municipios40' => CFDI40\Municipios::class,
109
        'numerosPedimentoAduana40' => CFDI40\NumerosPedimentoAduana::class,
110
        'objetosImpuestos40' => CFDI40\ObjetosImpuestos::class,
111
        'paises40' => CFDI40\Paises::class,
112
        'patentesAduanales40' => CFDI40\PatentesAduanales::class,
113
        'periodicidades40' => CFDI40\Periodicidades::class,
114
        'productosServicios40' => CFDI40\ProductosServicios::class,
115
        'regimenesFiscales40' => CFDI40\RegimenesFiscales::class,
116
        'reglasTasaCuota40' => CFDI40\ReglasTasaCuota::class,
117
        'tiposComprobantes40' => CFDI40\TiposComprobantes::class,
118
        'tiposFactores40' => CFDI40\TiposFactores::class,
119
        'tiposRelaciones40' => CFDI40\TiposRelaciones::class,
120
        'usosCfdi40' => CFDI40\UsosCfdi::class,
121
        // Nominas
122
        'bancos' => Nomina\Bancos::class,
123
        'contratos' => Nomina\TiposContratos::class,
124
        'deducciones' => Nomina\TiposDeducciones::class,
125
        'estados' => Nomina\Estados::class,
126
        'horasExtras' => Nomina\TiposHoras::class,
127
        'incapacidades' => Nomina\TiposIncapacidades::class,
128
        'jornadas' => Nomina\TiposJornadas::class,
129
        'nominas' => Nomina\TiposNominas::class,
130
        'origenesRecursos' => Nomina\OrigenesRecursos::class,
131
        'otrosTipoPago' => Nomina\TiposOtrosPagos::class,
132
        'percepciones' => Nomina\TiposPercepciones::class,
133
        'periodicidadesPagos' => Nomina\PeriodicidadesPagos::class,
134
        'regimenesContratacion' => Nomina\TiposRegimenes::class,
135
        'riesgosPuestos' => Nomina\RiesgosPuestos::class,
136
    ];
137
138
    /** @var Repository */
139
    private $repository;
140
141 59
    public function __construct(Repository $repository)
142
    {
143 59
        $this->repository = $repository;
144
    }
145
146
    /**
147
     * Magic method to return a catalog using the method name
148
     *
149
     * @param string $methodName
150
     * @param mixed[] $arguments
151
     * @return mixed
152
     * @throws SatCatalogosLogicException if cannot find a matching catalog with the method name
153
     */
154 58
    public function __call(string $methodName, array $arguments)
155
    {
156 58
        if (! isset($this->map[$methodName])) {
157 3
            throw new SatCatalogosLogicException("No se pudo encontrar el catálogo '$methodName'");
158
        }
159
160 55
        if (is_object($this->map[$methodName])) {
161 1
            return $this->map[$methodName];
162
        }
163
164
        try {
165 55
            $created = $this->create($this->map[$methodName]);
166
        } catch (LogicException $exception) {
167
            throw new SatCatalogosLogicException("No se pudo encontrar el catálogo '$methodName'", 0, $exception);
168
        }
169
170 55
        $this->map[$methodName] = $created;
171 55
        return $created;
172
    }
173
174
    /**
175
     * @param class-string $className
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string.
Loading history...
176
     * @return BaseCatalog
177
     */
178 55
    private function create(string $className): BaseCatalog
179
    {
180 55
        if (! class_exists($className)) {
181
            throw new LogicException("$className does not exists");
182
        }
183 55
        if (! in_array(BaseCatalog::class, class_implements($className) ?: [], true)) {
184
            throw new LogicException(sprintf('%s does not implements %s', $className, BaseCatalog::class));
185
        }
186
        /** @var BaseCatalog $object */
187 55
        $object = new $className();
188 55
        $object->withRepository($this->repository);
189
190 55
        return $object;
191
    }
192
}
193