|
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
|
|
|
|