Passed
Push — master ( 9d79d3...4bb85e )
by Esteban De La Fuente
08:41
created

CheckXmlDocumentSentStatusJob   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
eloc 25
dl 0
loc 69
c 1
b 0
f 0
ccs 0
cts 30
cp 0
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A checkSentStatus() 0 46 2
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 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
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\Package\Billing\Component\Integration\Worker\SiiLazy\Job;
26
27
use Derafu\Lib\Core\Foundation\Abstract\AbstractJob;
28
use Derafu\Lib\Core\Foundation\Contract\JobInterface;
29
use Derafu\Lib\Core\Helper\Rut;
30
use Derafu\Lib\Core\Package\Prime\Component\Xml\Contract\XmlComponentInterface;
31
use libredte\lib\Core\Package\Billing\Component\Integration\Contract\SiiRequestInterface;
32
use libredte\lib\Core\Package\Billing\Component\Integration\Exception\SiiCheckXmlDocumentSentStatusException;
33
use libredte\lib\Core\Package\Billing\Component\Integration\Exception\SiiConsumeWebserviceException;
34
use libredte\lib\Core\Package\Billing\Component\Integration\Support\Response\SiiCheckXmlDocumentSentStatusResponse;
35
36
/**
37
 * Clase para realizar las consultas de validación de documentos al SII.
38
 */
39
class CheckXmlDocumentSentStatusJob extends AbstractJob implements JobInterface
40
{
41
    public function __construct(
42
        private AuthenticateJob $authenticateJob,
43
        private ConsumeWebserviceJob $consumeWebserviceJob,
44
        private XmlComponentInterface $xmlComponent
45
    ) {
46
    }
47
48
    /**
49
     * Obtiene el estado actualizado del envío de un documento XML al SII.
50
     *
51
     * Este estado podría no ser el final, si no es un estado final se debe
52
     * reintentar la consulta posteriormente al SII.
53
     *
54
     * Referencia: https://www.sii.cl/factura_electronica/factura_mercado/estado_envio.pdf
55
     *
56
     * @param SiiRequestInterface $request Datos de la solicitud al SII.
57
     * @param int $trackId Número de seguimiento asignado al envío del XML.
58
     * @param string $company RUT de la empresa emisora del XML que se envió.
59
     * @return SiiCheckXmlDocumentSentStatusResponse
60
     * @throws SiiCheckXmlDocumentSentStatusException En caso de error.
61
     */
62
    public function checkSentStatus(
63
        SiiRequestInterface $request,
64
        int $trackId,
65
        string $company
66
    ): SiiCheckXmlDocumentSentStatusResponse {
67
        // Validar el RUT de la empresa que se utilizará para la consulta del
68
        // estado de envío al SII.
69
        Rut::validate($company);
70
        [$rutCompany, $dvCompany] = Rut::toArray($company);
71
72
        // Obtener el token asociado al certificado digital.
73
        $token = $this->authenticateJob->authenticate($request);
74
75
        // Datos para la consulta.
76
        $requestData = [
77
            'Rut' => $rutCompany,
78
            'Dv' => $dvCompany,
79
            'TrackId' => $trackId,
80
            'Token' => $token,
81
        ];
82
83
        // Consultar el estado del documento enviado al SII.
84
        try {
85
            $xmlResponse = $this->consumeWebserviceJob->sendRequest(
86
                $request,
87
                'QueryEstUp',
88
                'getEstUp',
89
                $requestData
90
            );
91
        } catch (SiiConsumeWebserviceException $e) {
92
            throw new SiiCheckXmlDocumentSentStatusException(sprintf(
93
                'No fue posible obtener el estado del XML enviado al SII con Track ID %s. %s',
94
                $trackId,
95
                $e->getMessage()
96
            ));
97
        }
98
99
        // Armar estado del XML enviado.
100
        $responseData = $this->xmlComponent->getDecoderWorker()->decode(
101
            $xmlResponse
102
        );
103
104
        // Retornar respuesta.
105
        return new SiiCheckXmlDocumentSentStatusResponse(
106
            $responseData,
107
            $requestData
108
        );
109
    }
110
}
111