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

Contribuyente::getComuna()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
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\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