Passed
Push — master ( 66ce43...256ff6 )
by Esteban De La Fuente
08:40
created

Contribuyente::__construct()   B

Complexity

Conditions 10
Paths 2

Size

Total Lines 36
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 10

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 10
eloc 14
c 1
b 0
f 0
nc 2
nop 10
dl 0
loc 36
ccs 14
cts 14
cp 1
crap 10
rs 7.6666

How to fix   Complexity    Many Parameters   

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:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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