Passed
Push — master ( e584ed...a08a48 )
by Esteban De La Fuente
05:48
created

Contribuyente::setData()   B

Complexity

Conditions 9
Paths 1

Size

Total Lines 59
Code Lines 50

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 49
CRAP Score 9.0048

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 9
eloc 50
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 59
ccs 49
cts 51
cp 0.9608
crap 9.0048
rs 7.5353

How to fix   Long Method   

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\Contribuyente;
26
27
use libredte\lib\Core\Helper\Rut;
28
use libredte\lib\Core\Service\ArrayDataProvider;
29
use libredte\lib\Core\Service\DataProviderInterface;
30
use libredte\lib\Core\Signature\Certificate;
31
use libredte\lib\Core\Signature\CertificateFaker;
32
use libredte\lib\Core\Sii\Dte\AutorizacionFolio\Caf;
33
use libredte\lib\Core\Sii\Dte\AutorizacionFolio\CafFaker;
34
35
/**
36
 * Clase para representar un contribuyente en el sistema del SII (Servicio de
37
 * Impuestos Internos).
38
 *
39
 * Proporciona información básica del contribuyente, como su RUT, razón social,
40
 * giro, entre otros.
41
 */
42
class Contribuyente
43
{
44
    /**
45
     * RUT del contribuyente.
46
     *
47
     * @var int
48
     */
49
    private int $rut;
50
51
    /**
52
     * Dígito verificador (DV) del RUT.
53
     *
54
     * @var string
55
     */
56
    private string $dv;
57
58
    /**
59
     * Razón social del contribuyente.
60
     *
61
     * @var string|null
62
     */
63
    private ?string $razon_social;
64
65
    /**
66
     * Giro comercial del contribuyente.
67
     *
68
     * @var string|null
69
     */
70
    private ?string $giro;
71
72
    /**
73
     * Código de actividad económica del contribuyente.
74
     *
75
     * @var int|null
76
     */
77
    private ?int $actividad_economica;
78
79
    /**
80
     * Teléfono del contribuyente.
81
     *
82
     * @var string|null
83
     */
84
    private ?string $telefono;
85
86
    /**
87
     * Dirección de correo electrónico del contribuyente.
88
     *
89
     * @var string|null
90
     */
91
    private ?string $email;
92
93
    /**
94
     * Dirección física del contribuyente.
95
     *
96
     * @var string|null
97
     */
98
    private ?string $direccion;
99
100
    /**
101
     * Comuna de residencia del contribuyente.
102
     *
103
     * @var string|null
104
     */
105
    private ?string $comuna;
106
107
    /**
108
     * Proveedor de datos.
109
     *
110
     * @var DataProviderInterface
111
     */
112
    protected DataProviderInterface $dataProvider;
113
114
    /**
115
     * Constructor de la clase Contribuyente.
116
     *
117
     * @param string|int|null $rut RUT del contribuyente.
118
     * @param string|null $razon_social Razón social del contribuyente.
119
     * @param string|null $giro Giro comercial del contribuyente.
120
     * @param int|null $actividad_economica Código de actividad económica.
121
     * @param string|null $telefono Teléfono del contribuyente.
122
     * @param string|null $email Correo electrónico del contribuyente.
123
     * @param string|null $direccion Dirección física del contribuyente.
124
     * @param string|null $comuna Comuna de residencia.
125
     * @param array|null $data Datos adicionales como array.
126
     * @param DataProviderInterface|null $dataProvider Proveedor de datos.
127
     */
128 60
    public function __construct(
129
        string|int|null $rut = null,
130
        ?string $razon_social = null,
131
        ?string $giro = null,
132
        ?int $actividad_economica = null,
133
        ?string $telefono = null,
134
        ?string $email = null,
135
        ?string $direccion = null,
136
        ?string $comuna = null,
137
        ?array $data = null,
138
        ?DataProviderInterface $dataProvider = null
139
    ) {
140
        // Asignar datos pasados en variable $data como arreglo.
141 60
        if ($data !== null) {
142 56
            $this->setData($data);
143
        }
144
145
        // Asignar datos pasados de manera individual.
146
        else {
147 4
            $rut = Rut::format($rut ?? '66666666-6');
0 ignored issues
show
Bug introduced by
It seems like $rut ?? '66666666-6' can also be of type null; however, parameter $rut of libredte\lib\Core\Helper\Rut::format() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

147
            $rut = Rut::format(/** @scrutinizer ignore-type */ $rut ?? '66666666-6');
Loading history...
148 4
            [$this->rut, $this->dv] = Rut::toArray($rut);
149
150 4
            $this->razon_social = $razon_social ?: null;
151 4
            $this->giro = $giro ?: null;
152 4
            $this->actividad_economica = $actividad_economica ?: null;
153 4
            $this->telefono = $telefono ?: null;
154 4
            $this->email = $email ?: null;
155 4
            $this->direccion = $direccion ?: null;
156 4
            $this->comuna = $comuna ?: null;
157
        }
158
159
        // Validar el RUT asignado (independiente del origen).
160 60
        Rut::validate($this->getRut());
161
162
        // Asignar proveedor de datos si se pasó o crear uno.
163 60
        $this->dataProvider = $dataProvider ?? new ArrayDataProvider();
164
    }
165
166
    /**
167
     * Asigna los datos del contribuyente desde un array.
168
     *
169
     * @param array $data Datos del contribuyente.
170
     */
171 56
    private function setData(array $data): void
172
    {
173 56
        $rut = (
174 56
            $data['rut']
175 56
            ?? $data['RUTEmisor']
176 56
            ?? $data['RUTRecep']
177 56
            ?? null
178
        ) ?: '66666666-6';
179 56
        [$this->rut, $this->dv] = Rut::toArray($rut);
180
181 56
        $this->razon_social = (
182 56
            $data['razon_social']
183 56
            ?? $data['RznSoc']
184 56
            ?? $data['RznSocEmisor']
185 56
            ?? $data['RznSocRecep']
186 56
            ?? null
187 9
        ) ?: null;
188
189 56
        $this->giro = (
190 56
            $data['giro']
191 56
            ?? $data['GiroEmis']
192 56
            ?? $data['GiroEmisor']
193 56
            ?? $data['GiroRecep']
194 56
            ?? null
195 9
        ) ?: null;
196
197 56
        $this->actividad_economica = (
198 56
            $data['actividad_economica']
199 56
            ?? $data['Acteco']
200 56
            ?? null
201 56
        ) ?: null;
202
203 56
        $this->telefono = (
204 56
            $data['telefono']
205 56
            ?? $data['Telefono']
206 56
            ?? $data['Contacto']
207 56
            ?? null
208 56
        ) ?: null;
209
210 56
        $this->email = (
211 56
            $data['email']
212 56
            ?? $data['CorreoEmisor']
213 56
            ?? $data['CorreoRecep']
214 56
            ?? null
215 56
        ) ?: null;
216
217 56
        $this->direccion = (
218 56
            $data['direccion']
219 56
            ?? $data['DirOrigen']
220 56
            ?? $data['DirRecep']
221 56
            ?? null
222
        ) ?: null;
223
224 56
        $this->comuna = (
225 56
            $data['comuna']
226 56
            ?? $data['CmnaOrigen']
227 56
            ?? $data['CmnaRecep']
228 56
            ?? null
229 9
        ) ?: null;
230
    }
231
232
    /**
233
     * Devuelve el RUT completo (incluyendo el DV) del contribuyente.
234
     *
235
     * @return string RUT completo del contribuyente.
236
     */
237 60
    public function getRut(): string
238
    {
239 60
        return $this->rut . '-' . $this->dv;
240
    }
241
242
    /**
243
     * Devuelve la razón social del contribuyente.
244
     *
245
     * Si no hay razón social, devuelve el RUT.
246
     *
247
     * @return string Razón social o RUT.
248
     */
249 58
    public function getRazonSocial(): string
250
    {
251 58
        return $this->razon_social ?? $this->getRut();
252
    }
253
254
    /**
255
     * Devuelve el giro comercial del contribuyente.
256
     *
257
     * @return string|null Giro del contribuyente o null si no se especifica.
258
     */
259 1
    public function getGiro(): ?string
260
    {
261 1
        return $this->giro;
262
    }
263
264
    /**
265
     * Devuelve el código de actividad económica del contribuyente.
266
     *
267
     * @return int|null Código de actividad económica o null.
268
     */
269 1
    public function getActividadEconomica(): ?int
270
    {
271 1
        return $this->actividad_economica;
272
    }
273
274
    /**
275
     * Devuelve el teléfono del contribuyente.
276
     *
277
     * @return string|null Teléfono del contribuyente o null.
278
     */
279 1
    public function getTelefono(): ?string
280
    {
281 1
        return $this->telefono;
282
    }
283
284
    /**
285
     * Devuelve el correo electrónico del contribuyente.
286
     *
287
     * @return string|null Correo electrónico del contribuyente o null.
288
     */
289 1
    public function getEmail(): ?string
290
    {
291 1
        return $this->email;
292
    }
293
294
    /**
295
     * Devuelve la dirección del contribuyente.
296
     *
297
     * @return string|null Dirección del contribuyente o null.
298
     */
299 1
    public function getDireccion(): ?string
300
    {
301 1
        return $this->direccion;
302
    }
303
304
    /**
305
     * Devuelve la comuna del contribuyente.
306
     *
307
     * @return string|null Comuna del contribuyente o null.
308
     */
309 1
    public function getComuna(): ?string
310
    {
311 1
        return $this->comuna;
312
    }
313
314
    /**
315
     * Genera y devuelve un certificado ficticio para el contribuyente.
316
     *
317
     * @return Certificate Certificado ficticio del contribuyente.
318
     */
319 30
    public function getFakeCertificate(): Certificate
320
    {
321 30
        $faker = new CertificateFaker();
322 30
        $faker->setSubject(
323 30
            serialNumber: $this->getRut(),
324 30
        );
325
326 30
        return $faker->create();
327
    }
328
329
    /**
330
     * Genera y devuelve un CAF (Código de Autorización de Folios)
331
     * ficticio para el contribuyente.
332
     *
333
     * @param int $codigoDocumento Código del tipo de documento.
334
     * @param int $folioDesde Número de folio inicial.
335
     * @param int|null $folioHasta Número de folio final. Si es `null`, se usa
336
     * el mismo valor de $folioDesde.
337
     * @return Caf CAF ficticio generado para el contribuyente.
338
     */
339 57
    public function getFakeCaf(
340
        int $codigoDocumento,
341
        int $folioDesde,
342
        ?int $folioHasta = null
343
    ): Caf {
344 57
        if ($folioHasta === null) {
345 56
            $folioHasta = $folioDesde;
346
        }
347
348 57
        $faker = new CafFaker($this->dataProvider);
349 57
        $faker->setEmisor($this->getRut(), $this->getRazonSocial());
350 57
        $faker->setTipoDocumento($codigoDocumento);
351 57
        $faker->setRangoFolios($folioDesde, $folioHasta);
352
353 57
        return $faker->create();
354
    }
355
}
356