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

DocumentoSanitizer::applyInitialSanitization()   C

Complexity

Conditions 10
Paths 193

Size

Total Lines 62
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 31
CRAP Score 12.174

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 32
c 1
b 0
f 0
nc 193
nop 1
dl 0
loc 62
ccs 31
cts 43
cp 0.7209
crap 12.174
rs 6.8916

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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