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

Contribuyente   A

Complexity

Total Complexity 30

Size/Duplication

Total Lines 314
Duplicated Lines 0 %

Test Coverage

Coverage 97.94%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 95
dl 0
loc 314
ccs 95
cts 97
cp 0.9794
rs 10
c 1
b 0
f 0
wmc 30

12 Methods

Rating   Name   Duplication   Size   Complexity  
B __construct() 0 36 10
A getEmail() 0 3 1
A getFakeCertificate() 0 8 1
A getRut() 0 3 1
A getDireccion() 0 3 1
A getComuna() 0 3 1
A getActividadEconomica() 0 3 1
A getFakeCaf() 0 15 2
A getTelefono() 0 3 1
A getRazonSocial() 0 3 1
A getGiro() 0 3 1
B setData() 0 61 9
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