Passed
Push — master ( cbeb6d...052d75 )
by Esteban De La Fuente
11:37 queued 03:06
created

AbstractRenderer::renderHtml()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 8
nc 1
nop 2
dl 0
loc 22
ccs 10
cts 10
cp 1
crap 1
rs 10
c 1
b 0
f 0
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\Dte\Documento\Renderer;
26
27
use libredte\lib\Core\Service\ArrayDataProvider;
28
use libredte\lib\Core\Service\DataProviderInterface;
29
use libredte\lib\Core\Service\PathManager;
30
use libredte\lib\Core\Sii\Dte\Documento\AbstractDocumento;
31
use LogicException;
32
use Mpdf\Mpdf;
33
use Mpdf\Output\Destination;
34
use Twig\Environment;
35
use Twig\Loader\FilesystemLoader;
36
37
/**
38
 * Clase abstracta (base) para los renderizadores de documentos tributarios
39
 * electrónicos (DTE).
40
 */
41
abstract class AbstractRenderer
42
{
43
    /**
44
     * Plantilla por defecto que se debe utilizar al renderizar el DTE.
45
     *
46
     * @var string
47
     */
48
    protected $defaultTemplate;
49
50
    /**
51
     * Proveedor de datos.
52
     *
53
     * @var DataProviderInterface
54
     */
55
    protected DataProviderInterface $dataProvider;
56
57
    /**
58
     * Constructor de la clase.
59
     *
60
     * @param ?DataProviderInterface $dataProvider Proveedor de datos.
61
     */
62 98
    public function __construct(?DataProviderInterface $dataProvider = null)
63
    {
64 98
        $this->dataProvider = $dataProvider ?? new ArrayDataProvider();
65
    }
66
67
    /**
68
     * Renderiza el documento en el formato solicitado (HTML o PDF).
69
     *
70
     * Por defecto se renderiza en formato PDF si no se especifica uno.
71
     *
72
     * @param AbstractDocumento $documento Documento a renderizar.
73
     * @param array $options Opciones para el renderizado.
74
     * @return string Datos del documento renderizado.
75
     */
76 98
    public function render(
77
        AbstractDocumento $documento,
78
        array $options = []
79
    ): string {
80
        // Opciones por defecto.
81 98
        $options = array_merge([
82 98
            'format' => 'pdf',
83 98
        ], $options);
84
85
        // Renderizar HTML del DTE.
86 98
        $html = $this->renderHtml($documento, $options);
87
88
        // Si el formato solicitado es HTML se retorna directamente.
89 98
        if ($options['format'] === 'html') {
90 49
            return $html;
91
        }
92
93
        // Renderizar el PDF a partir del HTML.
94 49
        $pdf = $this->renderPdf($html, $options);
95
96
        // Entregar el contenido del PDF renderizado.
97 49
        return $pdf;
98
    }
99
100
    /**
101
     * Entrega la plantilla por defecto asociada al renderizador del DTE.
102
     *
103
     * @return string Nombre de la plantilla por defecto.
104
     * @throws LogicException Si no existe una plantilla por defecto
105
     * asignada en el renderizador.
106
     */
107 98
    protected function getDefaultTemplate(): string
108
    {
109 98
        if (!isset($this->defaultTemplate)) {
110
            throw new LogicException(
111
                'No se ha asignado una plantilla por defecto para el renderizado del DTE.'
112
            );
113
        }
114
115 98
        return $this->defaultTemplate;
116
    }
117
118
    /**
119
     * Renderiza el documento en formato HTML.
120
     *
121
     * El renderizado se realiza mediante una plantilla twig.
122
     *
123
     * @param AbstractDocumento $documento Documento a renderizar.
124
     * @param array $options Opciones para el renderizado en HTML.
125
     * @return string Código HTML del documento renderizado.
126
     */
127 98
    protected function renderHtml(
128
        AbstractDocumento $documento,
129
        array $options = []
130
    ): string {
131
        // Opciones por defecto.
132 98
        $options = array_merge([
133 98
            'template' => $this->getDefaultTemplate(),
134 98
        ], $options);
135
136
        // Armar nombre de la plantilla twig.
137 98
        $template = $options['template'] . '.html.twig';
138
139
        // Preparar datos que se usarán para renderizar.
140 98
        $data = [
141 98
            'dte' => $documento->getData(),
142 98
        ];
143
144
        // Renderizar el HTML usando twig.
145 98
        $html = $this->renderHtmlWithTwig($template, $data);
146
147
        // Entregar el HTML renderizado.
148 98
        return $html;
149
    }
150
151
    /**
152
     * Renderiza una plantilla twig con ciertos datos.
153
     *
154
     * @param string $template Plantilla twig a renderizar.
155
     * @param array $data Datos que se pasarán a la plantilla twig.
156
     * @return string Código HTML con el renderizado de la plantilla twig.
157
     */
158 98
    protected function renderHtmlWithTwig(string $template, array $data): string
159
    {
160
        // Ubicación de las plantillas twig para los documentos tributarios.
161 98
        $templatesDir = PathManager::getTemplatesPath() . '/dte/documento';
162
163
        // Configurar Twig.
164 98
        $loader = new FilesystemLoader($templatesDir);
165 98
        $twig = new Environment($loader);
166
167
        // Renderizar la plantilla.
168 98
        return $twig->render($template, $data);
169
    }
170
171
    /**
172
     * Renderiza el documento en formato PDF.
173
     *
174
     * El renderizado se realiza a partir de un HTML previamente renderizado que
175
     * será pasado a PDF.
176
     */
177 49
    protected function renderPdf(string $html, array $options): string
178
    {
179
        // Generar el PDF con mPDF.
180 49
        $mpdf = new Mpdf();
181 49
        $mpdf->WriteHTML($html);
182
183
        // Obtener el contenido del PDF.
184 49
        $pdf = $mpdf->Output('', Destination::STRING_RETURN);
185
186
        // Entregar el contenido del PDF.
187 49
        return $pdf;
188
    }
189
}
190