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

RequestXmlDocumentSentStatusByEmailJob   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

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

2 Methods

Rating   Name   Duplication   Size   Complexity  
A requestEmail() 0 45 2
A __construct() 0 5 1
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\SiiConsumeWebserviceException;
33
use libredte\lib\Core\Package\Billing\Component\Integration\Exception\SiiRequestXmlDocumentSentStatusByEmailException;
34
use libredte\lib\Core\Package\Billing\Component\Integration\Support\Response\SiiRequestXmlDocumentSentStatusByEmailResponse;
35
36
/**
37
 * Clase para realizar las consultas de validación de documentos al SII.
38
 */
39
class RequestXmlDocumentSentStatusByEmailJob 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
     * Solicita al SII que le envíe el estado del DTE mediente correo
50
     * electrónico.
51
     *
52
     * El correo al que se informa el estado del DTE es el que está configurado
53
     * en el SII, no siendo posible asignarlo mediante el servicio web.
54
     *
55
     * La principal ventaja de utilizar este método es que el SII en el correo
56
     * incluye los detalles de los rechazos, algo que no entrega a través del
57
     * servicio web de consulta del estado del envío del XML al SII.
58
     *
59
     * Referencia: https://www.sii.cl/factura_electronica/factura_mercado/OIFE2005_wsDTECorreo_MDE.pdf
60
     *
61
     * @param SiiRequestInterface $request Datos de la solicitud al SII.
62
     * @param int $trackId Número de seguimiento asignado al envío del XML.
63
     * @param string $company RUT de la empresa emisora del documento.
64
     * @return SiiRequestXmlDocumentSentStatusByEmailResponse
65
     * @throws SiiRequestXmlDocumentSentStatusByEmailException En caso de error.
66
     */
67
    public function requestEmail(
68
        SiiRequestInterface $request,
69
        int $trackId,
70
        string $company
71
    ): SiiRequestXmlDocumentSentStatusByEmailResponse {
72
        // Validar los RUT que se utilizarán para la consulta de estado del DTE.
73
        Rut::validate($company);
74
        [$rutCompany, $dvCompany] = Rut::toArray($company);
75
76
        // Obtener el token asociado al certificado digital.
77
        $token = $this->authenticateJob->authenticate($request);
78
79
        // Datos para la consulta.
80
        $requestData = [
81
            'Token' => $token,
82
            'RutEmpresa' => $rutCompany,
83
            'DvEmpresa' => $dvCompany,
84
            'TrackId' => $trackId,
85
        ];
86
87
        // Solicitar al SII que envíe el correo electrónico del estado del DTE.
88
        try {
89
            $xmlResponse = $this->consumeWebserviceJob->sendRequest(
90
                $request,
91
                'wsDTECorreo',
92
                'reenvioCorreo',
93
                $requestData
94
            );
95
        } catch (SiiConsumeWebserviceException $e) {
96
            throw new SiiRequestXmlDocumentSentStatusByEmailException(sprintf(
97
                'No fue posible solicitar el correo con el estado del envío %d al SII. %s',
98
                $trackId,
99
                $e->getMessage()
100
            ));
101
        }
102
103
        // Armar estado del XML enviado.
104
        $responseData = $this->xmlComponent->getDecoderWorker()->decode(
105
            $xmlResponse
106
        );
107
108
        // Retornar respuesta.
109
        return new SiiRequestXmlDocumentSentStatusByEmailResponse(
110
            $responseData,
111
            $requestData
112
        );
113
    }
114
}
115