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

AbstractWebServiceResponse   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 131
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 27
c 1
b 0
f 0
dl 0
loc 131
ccs 0
cts 30
cp 0
rs 10
wmc 7

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getHeaders() 0 3 1
A getStatus() 0 5 1
A getBody() 0 3 1
A parseNumeroAtencion() 0 26 2
A getDescription() 0 5 1
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\WebService;
26
27
use InvalidArgumentException;
28
use libredte\lib\Core\Xml\XmlConverter;
29
use libredte\lib\Core\Xml\XmlDocument;
30
31
/**
32
 * Clase base para respuestas de los servicios web del SII utilizando SOAP.
33
 */
34
abstract class AbstractWebServiceResponse
35
{
36
    /**
37
     * Cabeceras que vienen en el XML de respuesta de la solicitud al SII.
38
     *
39
     * @var array
40
     */
41
    protected array $headers;
42
43
    /**
44
     * Cuerpo que viene en en XML de respuesta de la solicitud al SII.
45
     *
46
     * @var array
47
     */
48
    protected array $body;
49
50
    /**
51
     * Datos de las cabeceras y cuerpo normalizados para fácil manipulación.
52
     *
53
     * @var array
54
     */
55
    protected array $data;
56
57
    /**
58
     * Datos de la solicitud enviada al SII que generó esta respuesta.
59
     *
60
     * NOTE: no es obligatorio asignarlo, pero ayuda a tener el contexto
61
     * completo de la solicitud y respuesta del estado del documento al SII en
62
     * un único lugar (instancia).
63
     *
64
     * @var array
65
     */
66
    protected array $requestData;
67
68
    /**
69
     * Constructor que recibe la respuesta del SII y los datos de la solicitud.
70
     *
71
     * @param XmlDocument $response Documento XML de respuesta.
72
     * @param array $requestData Datos de la solicitud original enviada.
73
     */
74
    public function __construct(XmlDocument $response, array $requestData = [])
75
    {
76
        $responseArray = XmlConverter::xmlToArray($response);
77
        $this->headers = $responseArray['SII:RESPUESTA']['SII:RESP_HDR'];
78
        $this->body = $responseArray['SII:RESPUESTA']['SII:RESP_BODY'] ?? [];
79
        $this->requestData = $requestData;
80
    }
81
82
    /**
83
     * Obtiene los encabezados de la respuesta del SII.
84
     *
85
     * @return array Los encabezados de la respuesta.
86
     */
87
    public function getHeaders(): array
88
    {
89
        return $this->headers;
90
    }
91
92
    /**
93
     * Obtiene el cuerpo de la respuesta del SII.
94
     *
95
     * @return array El cuerpo de la respuesta.
96
     */
97
    public function getBody(): array
98
    {
99
        return $this->body;
100
    }
101
102
    /**
103
     * Obtiene los datos normalizados de la respuesta.
104
     *
105
     * @return array Datos normalizados de la respuesta del SII.
106
     */
107
    abstract public function getData();
108
109
    /**
110
     * Devuelve el estado de la solicitud realizada al SII.
111
     *
112
     * @return string El estado de la solicitud realizada al SII.
113
     */
114
    public function getStatus(): string
115
    {
116
        $data = $this->getData();
117
118
        return $data['status'];
119
    }
120
121
    /**
122
     * Devuelve la descripción de la solicitud realizada al SII.
123
     *
124
     * @return string La descripción de la solicitud realizada al SII.
125
     */
126
    public function getDescription(): string
127
    {
128
        $data = $this->getData();
129
130
        return $data['description'];
131
    }
132
133
    /**
134
     * Parsea el número de atención y la fecha/hora de un string.
135
     *
136
     * @param string $input Cadena con el número de atención y fecha/hora.
137
     * @return array Arreglo con el número y la fecha/hora en formato ISO.
138
     */
139
    protected function parseNumeroAtencion(string $input): array
140
    {
141
        // Normalizar espacios.
142
        $input = preg_replace('/\s+/', ' ', trim($input));
143
144
        // Extraer número y la fecha usando una expresión regular.
145
        if (preg_match(
146
            '/(\d+)\s+\(\s*(\d{4}\/\d{2}\/\d{2})\s+(\d{2}:\d{2}:\d{2})\s*\)/',
147
            $input,
148
            $matches
149
        )) {
150
            $number = $matches[1];
151
152
            // Formato ISO: YYYY/MM/DDTHH:MM:SS
153
            $datetime = $matches[2] . 'T' . $matches[3];
154
155
            // Convertir la fecha al formato ISO con guiones en vez de barras
156
            $datetimeISO = str_replace('/', '-', $datetime);
157
158
            return [(int) $number, $datetimeISO];
159
        }
160
161
        // Si el formato es incorrecto, lanzar una excepción.
162
        throw new InvalidArgumentException(sprintf(
163
            'El formato del número de atención "%s" es incorrecto.',
164
            $input
165
        ));
166
    }
167
}
168