Passed
Push — master ( 1e61c5...66ce43 )
by Esteban De La Fuente
08:48
created

XmlParser   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 13
c 1
b 0
f 0
dl 0
loc 34
ccs 0
cts 15
cp 0
rs 10
wmc 2

1 Method

Rating   Name   Duplication   Size   Complexity  
A parse() 0 26 2
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\Dte\Documento\Parser\Sii;
26
27
use libredte\lib\Core\Sii\Dte\Documento\Parser\DocumentoParserException;
28
use libredte\lib\Core\Sii\Dte\Documento\Parser\DocumentoParserInterface;
29
use libredte\lib\Core\Xml\XmlConverter;
30
use libredte\lib\Core\Xml\XmlDocument;
31
32
/**
33
 * Transforma los datos en formato XML con la estructura oficial del SII a un
34
 * arreglo PHP con la estructura oficial del SII.
35
 */
36
class XmlParser implements DocumentoParserInterface
37
{
38
    /**
39
     * Realiza la transformación de los datos del documento.
40
     *
41
     * @param string $data XML con los datos de entrada.
42
     * @return array Arreglo transformado a la estructura oficial del SII.
43
     */
44
    public function parse(string $data): array
45
    {
46
        // Cargar los datos del XML a un arreglo.
47
        $xmlDocument = new XmlDocument();
48
        $xmlDocument->loadXML($data);
49
        $array = XmlConverter::xmlToArray($xmlDocument);
50
51
        // Obtener los datos del documento a generar.
52
        $documentoData = $array['DTE']['Documento']
53
            ?? $array['DTE']['Exportaciones']
54
            ?? $array['DTE']['Liquidacion']
55
            ?? null
56
        ;
57
58
        // Si el XML no tiene los tags válidos se lanza una excepción.
59
        if ($documentoData === null) {
60
            throw new DocumentoParserException(
61
                'El nodo raíz del XML del documento debe ser el tag "DTE". Dentro de este nodo raíz debe existir un tag "Documento", "Exportaciones" o "Liquidacion". Este segundo nodo es el que debe contener los datos del documento.'
62
            );
63
        }
64
65
        // Quitar los atributos que tenga el tag encontrado.
66
        unset($documentoData['@attributes']);
67
68
        // Entregar los datos parseados.
69
        return $documentoData;
70
    }
71
}
72