ValidatorWorker::validate()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 28
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 5.4042

Importance

Changes 0
Metric Value
cc 4
eloc 15
c 0
b 0
f 0
nc 4
nop 1
dl 0
loc 28
ccs 10
cts 18
cp 0.5556
crap 5.4042
rs 9.7666
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
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 por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (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 GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Package\Prime\Component\Certificate\Worker;
26
27
use Derafu\Lib\Core\Foundation\Abstract\AbstractWorker;
28
use Derafu\Lib\Core\Package\Prime\Component\Certificate\Contract\CertificateInterface;
29
use Derafu\Lib\Core\Package\Prime\Component\Certificate\Contract\ValidatorWorkerInterface;
30
use Derafu\Lib\Core\Package\Prime\Component\Certificate\Exception\CertificateException;
31
32
/**
33
 * Clase que realizar validaciones al certificado digital para corroborar que
34
 * puede ser utilizado en una aplicación de facturación electrónica de Chile
35
 * según requerimientos del SII.
36
 */
37
class ValidatorWorker extends AbstractWorker implements ValidatorWorkerInterface
38
{
39
    /**
40
     * {@inheritDoc}
41
     */
42 2
    public function validate(CertificateInterface $certificate): void
43
    {
44
        // Validar que venga el ID (RUN) de la firma.
45 2
        $id = $certificate->getID(false);
46
47
        // Validar que venga DV en el ID (RUN).
48 2
        $dv = explode('-', $id)[1] ?? null;
49 2
        if ($dv === null) {
50 1
            throw new CertificateException(sprintf(
51 1
                'El ID (RUN) %s de la firma no es válido, debe incluir "-" (guión).',
52 1
                $id
53 1
            ));
54
        }
55
56
        // Validar que si el ID (RUN) termina con DV igual a "K", sea mayúscula.
57 1
        if ($dv === 'k') {
58
            throw new CertificateException(sprintf(
59
                'El RUN %s asociado a la firma no es válido, termina en "k" (minúscula). Debe adquirir una nueva firma y al comprarla corroborar que la "K" sea mayúscula. Se recomienda no comprar con el mismo proveedor: %s. No es posible utilizar un RUN que terminan con "k" (minúscula) en el certificado digital (firma electrónica).',
60
                $id,
61
                $certificate->getIssuer()
62
            ));
63
        }
64
65
        // Validar que la firma esté vigente (no vencida).
66 1
        if (!$certificate->isActive()) {
67
            throw new CertificateException(sprintf(
68
                'La firma venció el %s, debe usar una firma vigente. Si no posee una, debe adquirirla con un proveedor autorizado por el SII.',
69
                $certificate->getTo()
70
            ));
71
        }
72
    }
73
}
74