Passed
Push — master ( c02ff8...8cf6c5 )
by Esteban De La Fuente
06:05
created

ConnectionConfig::setAmbiente()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 5
ccs 0
cts 3
cp 0
crap 2
rs 10
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
11
 * por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia,
12
 * o (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\Helper\Arr;
28
29
/**
30
 * Clase para administrar todos los parámetros o configuraciones de la conexión
31
 * al sitio web del SII (Servicio de Impuestos Internos) de Chile.
32
 */
33
class ConnectionConfig
34
{
35
    /**
36
     * Constante para indicar ambiente de producción.
37
     *
38
     * @var int
39
     */
40
    public const PRODUCCION = 0;
41
42
    /**
43
     * Constante para indicar ambiente de certificación (pruebas).
44
     *
45
     * @var int
46
     */
47
    public const CERTIFICACION = 1;
48
49
    /**
50
     * Constante para indicar los reintentos por defecto, y máximos, que se
51
     * permiten al consumir un servicio web del SII.
52
     */
53
    public const REINTENTOS = 10;
54
55
    /**
56
     * Configuración por defecto de la conexión al SII.
57
     *
58
     * @var array
59
     */
60
    private array $config = [
61
        // Por defecto nos conectamos a los servidores de producción.
62
        'ambiente' => self::PRODUCCION,
63
64
        // Por defecto se asignan los servidores estándars de documentos
65
        // tributarios electrónicos (DTE) para producción (palena) y
66
        // certificación/pruebas (maullin).
67
        'servidores' => [
68
            'default' => [
69
                self::PRODUCCION => 'palena',
70
                self::CERTIFICACION => 'maullin',
71
            ],
72
            'www4' => [
73
                self::PRODUCCION => 'www4',
74
                self::CERTIFICACION => 'www4c',
75
            ],
76
        ],
77
78
        // URL de los WSDL de diferentes servicios del SII. Se define una regla
79
        // comodín "*" y otras específicas para ciertos servicios que tienen el
80
        // WSDL en otra ruta.
81
        'wsdl' => [
82
            'default' => 'https://%s.sii.cl/DTEWS/%s.jws?WSDL',
83
            'QueryEstDteAv' => 'https://%s.sii.cl/DTEWS/services/%s?WSDL',
84
            'wsDTECorreo' => 'https://%s.sii.cl/DTEWS/services/%s?WSDL',
85
        ],
86
87
        // Especifica cuántos reintentos se realizarán de manera automática al
88
        // hacer una solicitud al SII. El reintento se hará utilizando
89
        // "exponential backoff", por lo que un número muy grande implicará un
90
        // tiempo de ejecución alto.
91
        'reintentos' => self::REINTENTOS,
92
93
        // Especifica si se debe o no realizar la validación del certificado
94
        // SSL del SII. A veces, en pruebas sobre todo, ha resultado útil poder
95
        // desactivar esta validación. Sin embargo, se desaconseja hacerlo por
96
        // motivos de seguridad.
97
        'verificar_ssl' => true,
98
99
        // Esta es la caché por defecto que se utilizará al solicitar una caché
100
        // que implemente PSR-16 para la biblioteca (ej: TokenManager).
101
        'cache' => [
102
            'default' => 'memory', // Disponibles: "memory" o "filesystem".
103
        ],
104
    ];
105
106
    /**
107
     * Constructor de la configuración de conexión.
108
     *
109
     * @param array $config Arreglo con una configuración que reemplazará la
110
     * por defecto.
111
     */
112 6
    public function __construct(array $config = [])
113
    {
114 6
        $this->config = Arr::mergeRecursiveDistinct($this->config, $config);
115
    }
116
117
    /**
118
     * Entrega el ambiente que está configurado para realizar las conexiones al
119
     * Servicio de Impuestos Internos.
120
     *
121
     * @return int Ambiente que se utilizará en la conexión.
122
     */
123 5
    public function getAmbiente(): int
124
    {
125 5
        return (int) $this->config['ambiente'];
126
    }
127
128
    /**
129
     * Permite asignar el ambiente que se debe usar con las conexiones al
130
     * Servicio de Impuestos Internos.
131
     *
132
     * @return self
133
     */
134
    public function setAmbiente(int $ambiente = self::PRODUCCION): self
135
    {
136
        $this->config['ambiente'] = $ambiente;
137
138
        return $this;
139
    }
140
141
    /**
142
     * Entrega el servidor del SII según el tipo solicitado y ambiente.
143
     *
144
     * @param string $tipo Es el tipo de servidor que se está solicitando.
145
     * @return string Nombre del servidor al que se debe conectar en el SII.
146
     */
147 4
    public function getServidor(string $tipo = 'default'): string
148
    {
149 4
        $ambiente = $this->getAmbiente();
150
151 4
        return $this->config['servidores'][$tipo][$ambiente]
152 4
            ?? $this->config['servidores']['default'][$ambiente]
153 4
        ;
154
    }
155
156
    /**
157
     * Método que permite asignar el nombre del servidor del SII que se usará
158
     * para las consultas al SII.
159
     *
160
     * @param string $servidor Servidor que se usará. Ejemplo: maullin para
161
     * certificación o palena para producción.
162
     * @param int $ambiente Permite definir si se está cambiando el servidor de
163
     * certificación o el de producción.
164
     * @param string $tipo Permite definir el tipo de servidor que se está
165
     * asignando.
166
     * @return self
167
     */
168
    public function setServidor(
169
        string $servidor = 'palena',
170
        int $ambiente = self::PRODUCCION,
171
        string $tipo = 'default'
172
    ): self {
173
        $this->config['servidores'][$tipo][$ambiente] = $servidor;
174
175
        return $this;
176
    }
177
178
    /**
179
     * Entrega la URL de un WSDL según su servicio.
180
     *
181
     * @param string $servicio El servicio para el que se desea su WSDL.
182
     * @return string WSDL del servicio si fue encontrado o el WSDL por
183
     * defecto en el caso que no exista un WSDL específico para el servicio.
184
     */
185 3
    public function getWsdl(string $servicio): string
186
    {
187 3
        $wsdl = $this->config['wsdl'][$servicio]
188 3
            ?? $this->config['wsdl']['default']
189 3
        ;
190 3
        $servidor = $this->getServidor();
191
192 3
        return sprintf($wsdl, $servidor, $servicio);
193
    }
194
195
    /**
196
     * Entrega la cantidad de reintentos que se deben realizar al hacer una
197
     * consulta a un servicio web del SII.
198
     *
199
     * @return int
200
     */
201 2
    public function getReintentos(): int
202
    {
203 2
        return $this->config['reintentos'];
204
    }
205
206
    /**
207
     * Método que permite indicar si se debe o no verificar el certificado SSL
208
     * del SII.
209
     *
210
     * @param bool $verificar `true` si se quiere verificar certificado,
211
     * `false` en caso que no (por defecto se verifica).
212
     * @return self
213
     */
214
    public function setVerificarSsl(bool $verificar = true): self
215
    {
216
        $this->config['verificar_ssl'] = $verificar;
217
218
        return $this;
219
    }
220
221
    /**
222
     * Método que indica si se está o no verificando el SSL en las conexiones
223
     * al SII.
224
     *
225
     * @return bool `true` si se está verificando, `false` en caso contrario.
226
     */
227 2
    public function getVerificarSsl(): bool
228
    {
229 2
        return $this->config['verificar_ssl'];
230
    }
231
232
    /**
233
     * Método que entrega la URL de un recurso en el SII según el ambiente que
234
     * se esté usando.
235
     *
236
     * @param string $recurso Recurso del sitio de SII que se desea su URL.
237
     * @return string URL del recurso solicitado.
238
     */
239
    public function getUrl(string $recurso): string
240
    {
241
        $servidor = $recurso === '/anulacionMsvDteInternet'
242
            ? $this->getServidor('www4')
243
            : $this->getServidor()
244
        ;
245
246
        return sprintf('https://%s.sii.cl%s', $servidor, $recurso);
247
    }
248
249
    /**
250
     * Indica cuál es la caché por defecto que se debe utilizar.
251
     *
252
     * @return string Tipo de caché por defecto configurada.
253
     */
254 6
    public function getDefaultCache(): string
255
    {
256 6
        return $this->config['cache']['default'] === 'filesystem'
257
            ? 'filesystem'
258 6
            : 'memory'
259 6
        ;
260
    }
261
}
262