Passed
Pull Request — master (#14)
by
unknown
02:43
created

SatCatalogos::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 2
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
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\FormasDePago            formasDePago40();
36
 * @method CFDI40\Impuestos               impuestos40();
37
 * @method CFDI40\MetodosDePago           metodosDePago40();
38
 * @method CFDI40\Monedas                 monedas40();
39
 * @method CFDI40\NumerosPedimentoAduana  numerosPedimentoAduana40();
40
 * @method CFDI40\Paises                  paises40();
41
 * @method CFDI40\PatentesAduanales       patentesAduanales40();
42
 * @method CFDI40\ProductosServicios      productosServicios40();
43
 * @method CFDI40\RegimenesFiscales       regimenesFiscales40();
44
 * @method CFDI40\ReglasTasaCuota         reglasTasaCuota40();
45
 * @method CFDI40\TiposComprobantes       tiposComprobantes40();
46
 * @method CFDI40\TiposFactores           tiposFactores40();
47
 * @method CFDI40\TiposRelaciones         tiposRelaciones40();
48
 * @method CFDI40\UsosCfdi                usosCfdi40();
49
 *
50
 * @method Nomina\Bancos                bancos();
51
 * @method Nomina\TiposContratos        contratos();
52
 * @method Nomina\TiposDeducciones      deducciones();
53
 * @method Nomina\Estados               estados();
54
 * @method Nomina\TiposHoras            horasExtras();
55
 * @method Nomina\TiposIncapacidades    incapacidades();
56
 * @method Nomina\TiposJornadas         jornadas();
57
 * @method Nomina\TiposNominas          nominas();
58
 * @method Nomina\OrigenesRecursos      origenesRecursos();
59
 * @method Nomina\TiposOtrosPagos       otrosTipoPago();
60
 * @method Nomina\TiposPercepciones     percepciones();
61
 * @method Nomina\PeriodicidadesPagos   periodicidadesPagos();
62
 * @method Nomina\TiposRegimenes        regimenesContratacion();
63
 * @method Nomina\RiesgosPuestos        riesgosPuestos();
64
 */
65
class SatCatalogos
66
{
67
    /** @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...
68
    private $map = [
69
        // CFDI
70
        'aduanas' => CFDI\Aduanas::class,
71
        'clavesUnidades' => CFDI\ClavesUnidades::class,
72
        'codigosPostales' => CFDI\CodigosPostales::class,
73
        'formasDePago' => CFDI\FormasDePago::class,
74
        'impuestos' => CFDI\Impuestos::class,
75
        'metodosDePago' => CFDI\MetodosDePago::class,
76
        'monedas' => CFDI\Monedas::class,
77
        'numerosPedimentoAduana' => CFDI\NumerosPedimentoAduana::class,
78
        'paises' => CFDI\Paises::class,
79
        'patentesAduanales' => CFDI\PatentesAduanales::class,
80
        'productosServicios' => CFDI\ProductosServicios::class,
81
        'regimenesFiscales' => CFDI\RegimenesFiscales::class,
82
        'reglasTasaCuota' => CFDI\ReglasTasaCuota::class,
83
        'tiposComprobantes' => CFDI\TiposComprobantes::class,
84
        'tiposFactores' => CFDI\TiposFactores::class,
85
        'tiposRelaciones' => CFDI\TiposRelaciones::class,
86
        'usosCfdi' => CFDI\UsosCfdi::class,
87
        // CFDI40
88
        'aduanas40' => CFDI40\Aduanas::class,
89
        'clavesUnidades40' => CFDI40\ClavesUnidades::class,
90
        'codigosPostales40' => CFDI40\CodigosPostales::class,
91
        'formasDePago40' => CFDI40\FormasDePago::class,
92
        'impuestos40' => CFDI40\Impuestos::class,
93
        'metodosDePago40' => CFDI40\MetodosDePago::class,
94
        'monedas40' => CFDI40\Monedas::class,
95
        'numerosPedimentoAduana40' => CFDI40\NumerosPedimentoAduana::class,
96
        'paises40' => CFDI40\Paises::class,
97
        'patentesAduanales40' => CFDI40\PatentesAduanales::class,
98
        'productosServicios40' => CFDI40\ProductosServicios::class,
99
        'regimenesFiscales40' => CFDI40\RegimenesFiscales::class,
100
        'reglasTasaCuota40' => CFDI40\ReglasTasaCuota::class,
101
        'tiposComprobantes40' => CFDI40\TiposComprobantes::class,
102
        'tiposFactores40' => CFDI40\TiposFactores::class,
103
        'tiposRelaciones40' => CFDI40\TiposRelaciones::class,
104
        'usosCfdi40' => CFDI40\UsosCfdi::class,
105
        // Nominas
106
        'contratos' => Nomina\TiposContratos::class,
107
        'nominas' => Nomina\TiposNominas::class,
108
        'jornadas' => Nomina\TiposJornadas::class,
109
        'origenesRecursos' => Nomina\OrigenesRecursos::class,
110
        'bancos' => Nomina\Bancos::class,
111
        'estados' => Nomina\Estados::class,
112
        'periodicidadesPagos' => Nomina\PeriodicidadesPagos::class,
113
        'riesgosPuestos' => Nomina\RiesgosPuestos::class,
114
        'deducciones' => Nomina\TiposDeducciones::class,
115
        'horasExtras' => Nomina\TiposHoras::class,
116
        'incapacidades' => Nomina\TiposIncapacidades::class,
117
        'otrosTipoPago' => Nomina\TiposOtrosPagos::class,
118
        'percepciones' => Nomina\TiposPercepciones::class,
119
        'regimenesContratacion' => Nomina\TiposRegimenes::class,
120
    ];
121
122
    /** @var Repository */
123
    private $repository;
124
125 54
    public function __construct(Repository $repository)
126
    {
127 54
        $this->repository = $repository;
128
    }
129
130
    /**
131
     * Magic method to return a catalog using the method name
132
     *
133
     * @param string $methodName
134
     * @param mixed[] $arguments
135
     * @return mixed
136
     * @throws SatCatalogosLogicException if cannot find a matching catalog with the method name
137
     */
138 53
    public function __call(string $methodName, array $arguments)
139
    {
140 53
        if (! isset($this->map[$methodName])) {
141 3
            throw new SatCatalogosLogicException("No se pudo encontrar el catálogo '$methodName'");
142
        }
143
144 50
        if (is_object($this->map[$methodName])) {
145 1
            return $this->map[$methodName];
146
        }
147
148
        try {
149
            /** @var mixed $created */
150 50
            $created = $this->create($this->map[$methodName]);
151
        } catch (LogicException $exception) {
152
            throw new SatCatalogosLogicException("No se pudo encontrar el catálogo '$methodName'", 0, $exception);
153
        }
154
155 50
        $this->map[$methodName] = $created;
156 50
        return $created;
157
    }
158
159
    /**
160
     * @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...
161
     * @return BaseCatalog
162
     */
163 50
    private function create(string $className): BaseCatalog
164
    {
165 50
        if (! class_exists($className)) {
166
            throw new LogicException("$className does not exists");
167
        }
168 50
        if (! in_array(BaseCatalog::class, class_implements($className) ?: [], true)) {
169
            throw new LogicException(sprintf('%s does not implements %s', $className, BaseCatalog::class));
170
        }
171
        /** @var BaseCatalog $object */
172 50
        $object = new $className();
173 50
        $object->withRepository($this->repository);
174
175 50
        return $object;
176
    }
177
}
178