Test Failed
Push — master ( 59e870...659f9a )
by Esteban De La Fuente
04:33
created

getData()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 29
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 15
nc 5
nop 0
dl 0
loc 29
ccs 0
cts 19
cp 0
crap 20
rs 9.7666
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\Response;
26
27
use libredte\lib\Core\Package\Billing\Component\Integration\Abstract\AbstractSiiWsdlResponse;
28
29
/**
30
 * Respuesta de la solicitud de correo de estado de un documento subido al SII.
31
 *
32
 * Referencia: https://www.sii.cl/factura_electronica/factura_mercado/OIFE2005_wsDTECorreo_MDE.pdf
33
 */
34
class SiiDocumentRequestSentStatusByEmailResponse extends AbstractSiiWsdlResponse
35
{
36
    /**
37
     * Estados de salida y error.
38
     *
39
     * El resultado de la consulta al SII puede arrojar uno de estos estados.
40
     *
41
     * En otros servicios los estados se separan en estados "normales" y
42
     * "errores", acá solo hay una lista donde solo "0" es el estado "normal" y
43
     * todo los demás son códigos de estado de errores.
44
     */
45
    private const STATUSES = [
46
        '0' => 'Requerimiento recibido OK.',
47
        // Errores de Datos.
48
        '101' => 'Error en dígito verificador del Rut de la empresa.',
49
        '102' => 'Faltan datos de entrada.',
50
        '105' => 'Error Track ID no existe.',
51
        '106' => 'Usuario autenticado no tiene permisos sobre Empresa.',
52
        '114' => 'Envío solicitado no ha concluido su validación, por lo tanto no existe correo.',
53
        // Errores por autenticación.
54
        '104' => 'Token Inactivo o No Existe',
55
        // Otros Errores.
56
        '103' => 'Error Interno.',
57
        '107' => 'Error Interno.',
58
        '108' => 'Error Interno.',
59
        '110' => 'Error Interno.',
60
        '111' => 'Error Interno.',
61
        '112' => 'Error Interno.',
62
        '113' => 'Error Interno.',
63
    ];
64
65
    /**
66
     * Obtiene los datos normalizados de la respuesta.
67
     *
68
     * @return array Datos normalizados de la respuesta del SII.
69
     */
70
    public function getData(): array
71
    {
72
        // Si no existen los datos normalizados de la respuesta se normalizan.
73
        if (!isset($this->data)) {
74
            // RUT de la empresa emisora del documento.
75
            $rutExists = isset($this->requestData['RutEmpresa'])
76
                && isset($this->requestData['DvEmpresa'])
77
            ;
78
            $company = $rutExists
79
                ? $this->requestData['RutEmpresa']
80
                    . '-' . $this->requestData['DvEmpresa']
81
                : null
82
            ;
83
84
            // Normalizar el estado de la consulta del envío.
85
            [$status, $description] = $this->parseEstado($this->headers);
86
87
            // Armar los datos normalizados.
88
            $this->data = [
89
                'company' => $company,
90
                'track_id' => $this->requestData['TrackId'] ?? null,
91
                'status' => $status,
92
                'description' => $description,
93
                'token' => $this->requestData['Token'] ?? null,
94
            ];
95
        }
96
97
        // Entregar los datos de la respuesta del estado del DTE.
98
        return $this->data;
99
    }
100
101
    /**
102
     * Parsea el estado de la respuesta del SII.
103
     *
104
     * @param array $headers Encabezados de la respuesta.
105
     * @return array Arreglo con el estado, error y descripción.
106
     */
107
    private function parseEstado(array $headers): array
108
    {
109
        // Asignar el código del estado.
110
        $status = $headers['SII:ESTADO'];
111
        $description = $headers['SII:GLOSA'] ?? null;
112
113
        // Si existe una glosa para el estado se reemplaza la recibida del SII.
114
        if (isset(self::STATUSES[$status])) {
115
            $description = self::STATUSES[$status];
116
        }
117
118
        // Entregar valores determinados para el error.
119
        return [$status, $description];
120
    }
121
}
122