AbstractSiiWsdlResponse::getHeaders()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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