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

DocumentoSanitizer::sanitize()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 6
ccs 4
cts 4
cp 1
crap 1
rs 10
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\Normalization;
26
27
use libredte\lib\Core\Helper\Rut;
28
use libredte\lib\Core\Sii\Dte\Documento\DocumentoException;
29
30
/**
31
 * Clase que maneja la limpieza (sanitización) de los datos de un documento.
32
 *
33
 * El objetivo es reducir los problemas por errores de esquema que se pueden
34
 * dar por los datos que se usan para crear el documento.
35
 */
36
class DocumentoSanitizer
37
{
38
    /**
39
     * Ejecuta la limpieza de los datos.
40
     *
41
     * @param array $data Arreglo con los datos del documento a limpiar.
42
     * @return array Arreglo con los datos limpios.
43
     */
44 114
    public function sanitize(array $data): array
45
    {
46 114
        $data = $this->applyInitialSanitization($data);
47 114
        $data = $this->applyProSanitization($data);
48
49 114
        return $data;
50
    }
51
52
    /**
53
     * Limpia los datos del documento.
54
     *
55
     * @param array $data Arreglo con los datos del documento a limpiar.
56
     * @return array Arreglo con los datos limpios.
57
     */
58 114
    private function applyInitialSanitization(array $data): array
59
    {
60
        // Si no viene un folio asignado error.
61 114
        if (!isset($data['Encabezado']['IdDoc']['Folio'])) {
62
            throw new DocumentoException(
63
                'Es obligatorio indicar el folio del documento.'
64
            );
65
        }
66
67
        // Formatear y validar los RUT.
68 114
        $data['Encabezado']['Emisor']['RUTEmisor'] = Rut::format(
69 114
            $data['Encabezado']['Emisor']['RUTEmisor']
70 114
        );
71 114
        $data['Encabezado']['Receptor']['RUTRecep'] = Rut::format(
72 114
            $data['Encabezado']['Receptor']['RUTRecep']
73 114
        );
74 114
        Rut::validate($data['Encabezado']['Emisor']['RUTEmisor']);
75 114
        Rut::validate($data['Encabezado']['Receptor']['RUTRecep']);
76
77
        // Limpiar datos del emisor.
78 114
        if (!empty($data['Encabezado']['Emisor']['Acteco'])) {
79 93
            if (strlen((string)$data['Encabezado']['Emisor']['Acteco']) === 5) {
80
                $data['Encabezado']['Emisor']['Acteco'] =
81
                    '0' . $data['Encabezado']['Emisor']['Acteco']
82
                ;
83
            }
84
        }
85
86
        // Limpiar datos del receptor.
87 114
        if (!empty($data['Encabezado']['Receptor']['RznSocRecep'])) {
88 114
            $data['Encabezado']['Receptor']['RznSocRecep'] =
89 114
                mb_substr($data['Encabezado']['Receptor']['RznSocRecep'], 0, 100)
90 114
            ;
91
        }
92 114
        if (!empty($data['Encabezado']['Receptor']['GiroRecep'])) {
93 97
            $data['Encabezado']['Receptor']['GiroRecep'] =
94 97
                mb_substr($data['Encabezado']['Receptor']['GiroRecep'], 0, 40)
95 97
            ;
96
        }
97 114
        if (!empty($data['Encabezado']['Receptor']['Contacto'])) {
98
            $data['Encabezado']['Receptor']['Contacto'] =
99
                mb_substr($data['Encabezado']['Receptor']['Contacto'], 0, 80)
100
            ;
101
        }
102 114
        if (!empty($data['Encabezado']['Receptor']['CorreoRecep'])) {
103
            $data['Encabezado']['Receptor']['CorreoRecep'] =
104
                mb_substr($data['Encabezado']['Receptor']['CorreoRecep'], 0, 80)
105
            ;
106
        }
107 114
        if (!empty($data['Encabezado']['Receptor']['DirRecep'])) {
108 114
            $data['Encabezado']['Receptor']['DirRecep'] =
109 114
                mb_substr($data['Encabezado']['Receptor']['DirRecep'], 0, 70)
110 114
            ;
111
        }
112 114
        if (!empty($data['Encabezado']['Receptor']['CmnaRecep'])) {
113 98
            $data['Encabezado']['Receptor']['CmnaRecep'] =
114 98
                mb_substr($data['Encabezado']['Receptor']['CmnaRecep'], 0, 20)
115 98
            ;
116
        }
117
118
        // Entregar los datos limpios.
119 114
        return $data;
120
    }
121
122
    /**
123
     * Limpia los datos del documento utilizando funcionalidades Pro.
124
     *
125
     * @param array $data Arreglo con los datos del documento a limpiar.
126
     * @return array Arreglo con los datos limpios.
127
     */
128 114
    private function applyProSanitization(array $data): array
129
    {
130
        // Limpiar los datos con las funcionalidades Pro de la biblioteca.
131 114
        $class = '\libredte\lib\Pro\Sii\Dte\Documento\Normalization\DocumentoSanitizer';
132 114
        if (class_exists($class)) {
133
            $sanitizer = $class::create($this);
134
            $data = $sanitizer->sanitize($data);
135
        }
136
137
        // Entregar los datos limpios.
138 114
        return $data;
139
    }
140
}
141