Test Failed
Push — master ( e6f4b5...c3cccf )
by
unknown
15:56
created

SiiClient   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 160
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 40
c 1
b 0
f 0
dl 0
loc 160
ccs 0
cts 42
cp 0
rs 10
wmc 8

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getDocumentValidator() 0 3 1
A __construct() 0 25 1
A getDocumentUploader() 0 3 1
A getWsdlConsumer() 0 3 1
A getConfig() 0 3 1
A getCache() 0 28 3
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * LibreDTE: Biblioteca PHP (Núcleo).
7
 * Copyright (C) LibreDTE <https://www.libredte.cl>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de
20
 * GNU junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace libredte\lib\Core\Sii\HttpClient;
26
27
use libredte\lib\Core\Service\PathManager;
28
use libredte\lib\Core\Signature\Certificate;
29
use libredte\lib\Core\Sii\HttpClient\WebService\DocumentUploader;
30
use libredte\lib\Core\Sii\HttpClient\WebService\DocumentValidator;
31
use Psr\SimpleCache\CacheInterface;
32
use Symfony\Component\Cache\Adapter\ArrayAdapter;
33
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
34
use Symfony\Component\Cache\Psr16Cache;
35
36
/**
37
 * Clase que funciona como "punto de entrada" para la comunicación entre la
38
 * biblioteca de LibreDTE y el Servicio de Impuestos Internos (SII) de Chile.
39
 */
40
class SiiClient
41
{
42
    /**
43
     * Certificado digital.
44
     *
45
     * @var Certificate
46
     */
47
    private Certificate $certificate;
48
49
    /**
50
     * Configuración de la conexión al SII.
51
     *
52
     * @var ConnectionConfig
53
     */
54
    private ConnectionConfig $config;
55
56
    /**
57
     * Instancia con la implementación de la caché para usar en el cliente.
58
     *
59
     * @var CacheInterface
60
     */
61
    private CacheInterface $cache;
62
63
    /**
64
     * Cliente de la API SOAP del SII.
65
     *
66
     * @var WsdlConsumer
67
     */
68
    private WsdlConsumer $wsdlConsumer;
69
70
    /**
71
     * Administrador de tokens de autenticación del SII.
72
     *
73
     * @var TokenManager
74
     */
75
    private TokenManager $tokenManager;
76
77
    /**
78
     * Instancia que envía un documento al SII y valida su estado.
79
     *
80
     * @var DocumentUploader
81
     */
82
    private DocumentUploader $documentUploader;
83
84
    /**
85
     * Instancia para la validación de documentos tributarios en el SII.
86
     *
87
     * @var DocumentValidator
88
     */
89
    private DocumentValidator $documentValidator;
90
91
    /**
92
     * Constructor del cliente del SII.
93
     *
94
     * @param Certificate $certificate
95
     * @param array $config
96
     * @param CacheInterface $cache
97
     */
98
    public function __construct(
99
        Certificate $certificate,
100
        array $config = [],
101
        ?CacheInterface $cache = null,
102
    ) {
103
        $this->certificate = $certificate;
104
        $this->config = new ConnectionConfig($config);
105
        $this->cache = $cache ?? $this->getCache();
106
        $this->wsdlConsumer = new WsdlConsumer(
107
            $this->certificate,
108
            $this->config,
109
        );
110
        $this->tokenManager = new TokenManager(
111
            $this->cache,
112
            $this->wsdlConsumer,
113
        );
114
        $this->documentUploader = new DocumentUploader(
115
            $this->certificate,
116
            $this->config,
117
            $this->tokenManager,
118
        );
119
        $this->documentValidator = new DocumentValidator(
120
            $this->certificate,
121
            $this->wsdlConsumer,
122
            $this->tokenManager,
123
        );
124
    }
125
126
    /**
127
     * Entrega la instancia de ConnectionConfig asociada al cliente del SII.
128
     *
129
     * @return ConnectionConfig
130
     */
131
    public function getConfig(): ConnectionConfig
132
    {
133
        return $this->config;
134
    }
135
136
    /**
137
     * Entrega la instancia de WsdlConsumer asociada al cliente del SII.
138
     *
139
     * @return WsdlConsumer
140
     */
141
    public function getWsdlConsumer(): WsdlConsumer
142
    {
143
        return $this->wsdlConsumer;
144
    }
145
146
    /**
147
     * Entrega la instancia de DocumentUploader asociada al cliente del SII.
148
     *
149
     * @return DocumentUploader
150
     */
151
    public function getDocumentUploader(): DocumentUploader
152
    {
153
        return $this->documentUploader;
154
    }
155
156
    /**
157
     * Entrega la instancia de DocumentValidator asociada al cliente del SII.
158
     *
159
     * @return DocumentValidator
160
     */
161
    public function getDocumentValidator(): DocumentValidator
162
    {
163
        return $this->documentValidator;
164
    }
165
166
    /**
167
     * Entrega una instancia con la implementación de una caché para ser
168
     * utilizada en la biblioteca.
169
     *
170
     * @return CacheInterface Implementación de caché PSR-16.
171
     */
172
    private function getCache(): CacheInterface
173
    {
174
        // Si no está asignada la caché se asigna a una por defecto.
175
        if (!isset($this->cache)) {
176
            // Se busca cuál es el tipo de caché por defecto que se debe usar.
177
            $defaultCache = $this->config->getDefaultCache();
178
179
            // Asignar una implementación de caché en el sistema de archivos.
180
            if ($defaultCache === 'filesystem') {
181
                $adapter = new FilesystemAdapter(
182
                    'libredte_lib',
183
                    3600, // TTL por defecto a una hora (3600 segundos).
184
                    PathManager::getCachePath()
185
                );
186
            }
187
188
            // Asignar una implementación de caché en memoria.
189
            else {
190
                $adapter = new ArrayAdapter();
191
            }
192
193
            // Asignar el adaptador de la caché que se utilizará convirtiéndolo
194
            // a una instancia válida de PSR-16.
195
            $this->cache = new Psr16Cache($adapter);
196
        }
197
198
        // Entregar la instancia de la caché.
199
        return $this->cache;
200
    }
201
}
202