Passed
Pull Request — master (#15)
by
unknown
02:13
created

SatCatalogos   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Test Coverage

Coverage 80%

Importance

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

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A create() 0 13 4
A __call() 0 19 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 Nomina\Bancos                bancos();
33
 * @method Nomina\TiposContratos        contratos();
34
 * @method Nomina\TiposDeducciones      deducciones();
35
 * @method Nomina\Estados               estados();
36
 * @method Nomina\TiposHoras            horasExtras();
37
 * @method Nomina\TiposIncapacidades    incapacidades();
38
 * @method Nomina\TiposJornadas         jornadas();
39
 * @method Nomina\TiposNominas          nominas();
40
 * @method Nomina\OrigenesRecursos      origenesRecursos();
41
 * @method Nomina\TiposOtrosPagos       otrosTipoPago();
42
 * @method Nomina\TiposPercepciones     percepciones();
43
 * @method Nomina\PeriodicidadesPagos   periodicidadesPagos();
44
 * @method Nomina\TiposRegimenes        regimenesContratacion();
45
 * @method Nomina\RiesgosPuestos        riesgosPuestos();
46
 */
47
class SatCatalogos
48
{
49
    /** @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...
50
    private $map = [
51
        // CFDI
52
        'aduanas' => CFDI\Aduanas::class,
53
        'clavesUnidades' => CFDI\ClavesUnidades::class,
54
        'codigosPostales' => CFDI\CodigosPostales::class,
55
        'formasDePago' => CFDI\FormasDePago::class,
56
        'impuestos' => CFDI\Impuestos::class,
57
        'metodosDePago' => CFDI\MetodosDePago::class,
58
        'monedas' => CFDI\Monedas::class,
59
        'numerosPedimentoAduana' => CFDI\NumerosPedimentoAduana::class,
60
        'paises' => CFDI\Paises::class,
61
        'patentesAduanales' => CFDI\PatentesAduanales::class,
62
        'productosServicios' => CFDI\ProductosServicios::class,
63
        'regimenesFiscales' => CFDI\RegimenesFiscales::class,
64
        'reglasTasaCuota' => CFDI\ReglasTasaCuota::class,
65
        'tiposComprobantes' => CFDI\TiposComprobantes::class,
66
        'tiposFactores' => CFDI\TiposFactores::class,
67
        'tiposRelaciones' => CFDI\TiposRelaciones::class,
68
        'usosCfdi' => CFDI\UsosCfdi::class,
69
        // Nominas
70
        'contratos' => Nomina\TiposContratos::class,
71
        'nominas' => Nomina\TiposNominas::class,
72
        'jornadas' => Nomina\TiposJornadas::class,
73
        'origenesRecursos' => Nomina\OrigenesRecursos::class,
74
        'bancos' => Nomina\Bancos::class,
75
        'estados' => Nomina\Estados::class,
76
        'periodicidadesPagos' => Nomina\PeriodicidadesPagos::class,
77
        'riesgosPuestos' => Nomina\RiesgosPuestos::class,
78
        'deducciones' => Nomina\TiposDeducciones::class,
79
        'horasExtras' => Nomina\TiposHoras::class,
80
        'incapacidades' => Nomina\TiposIncapacidades::class,
81
        'otrosTipoPago' => Nomina\TiposOtrosPagos::class,
82
        'percepciones' => Nomina\TiposPercepciones::class,
83
        'regimenesContratacion' => Nomina\TiposRegimenes::class,
84
    ];
85
86
    /** @var Repository */
87
    private $repository;
88
89 37
    public function __construct(Repository $repository)
90
    {
91 37
        $this->repository = $repository;
92
    }
93
94
    /**
95
     * Magic method to return a catalog using the method name
96
     *
97
     * @param string $methodName
98
     * @param mixed[] $arguments
99
     * @return mixed
100
     * @throws SatCatalogosLogicException if cannot find a matching catalog with the method name
101
     */
102 36
    public function __call(string $methodName, array $arguments)
103
    {
104 36
        if (! isset($this->map[$methodName])) {
105 3
            throw new SatCatalogosLogicException("No se pudo encontrar el catálogo '$methodName'");
106
        }
107
108 33
        if (is_object($this->map[$methodName])) {
109 1
            return $this->map[$methodName];
110
        }
111
112
        try {
113
            /** @var mixed $created */
114 33
            $created = $this->create($this->map[$methodName]);
115
        } catch (LogicException $exception) {
116
            throw new SatCatalogosLogicException("No se pudo encontrar el catálogo '$methodName'", 0, $exception);
117
        }
118
119 33
        $this->map[$methodName] = $created;
120 33
        return $created;
121
    }
122
123
    /**
124
     * @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...
125
     * @return BaseCatalog
126
     */
127 33
    private function create(string $className): BaseCatalog
128
    {
129 33
        if (! class_exists($className)) {
130
            throw new LogicException("$className does not exists");
131
        }
132 33
        if (! in_array(BaseCatalog::class, class_implements($className) ?: [], true)) {
133
            throw new LogicException(sprintf('%s does not implements %s', $className, BaseCatalog::class));
134
        }
135
        /** @var BaseCatalog $object */
136 33
        $object = new $className();
137 33
        $object->withRepository($this->repository);
138
139 33
        return $object;
140
    }
141
}
142