Test Failed
Push — master ( e6f4b5...c3cccf )
by
unknown
15:56
created

AbstractRenderer::render()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
c 1
b 0
f 0
nc 2
nop 2
dl 0
loc 18
ccs 0
cts 7
cp 0
crap 6
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\Dte\Documento\Renderer;
26
27
use libredte\lib\Core\Service\ArrayDataProvider;
28
use libredte\lib\Core\Service\DataProviderInterface;
29
use libredte\lib\Core\Service\RendererTemplateService;
30
use libredte\lib\Core\Sii\Dte\Documento\AbstractDocumento;
31
use LogicException;
32
33
/**
34
 * Clase abstracta (base) para los renderizadores de documentos tributarios
35
 * electrónicos (DTE).
36
 */
37
abstract class AbstractRenderer implements RendererInterface
38
{
39
    /**
40
     * Plantilla por defecto que se debe utilizar al renderizar el DTE.
41
     *
42
     * @var string
43
     */
44
    protected string $defaultTemplate;
45
46
    /**
47
     * Proveedor de datos.
48
     *
49
     * @var DataProviderInterface
50
     */
51
    protected DataProviderInterface $dataProvider;
52
53
    /**
54
     * Servicio de renderizado de plantillas.
55
     *
56
     * @var RendererTemplateService
57
     */
58
    private RendererTemplateService $rendererService;
59
60
    /**
61
     * Constructor de la clase.
62
     *
63
     * @param ?DataProviderInterface $dataProvider Proveedor de datos.
64
     * @param ?RendererTemplateService $rendererService Proveedor de datos.
65
     */
66
    public function __construct(
67
        ?DataProviderInterface $dataProvider = null,
68
        ?RendererTemplateService $rendererService = null
69
    ) {
70
        $this->dataProvider = $dataProvider ?? new ArrayDataProvider();
71
        $this->rendererService = $rendererService ?? new RendererTemplateService();
72
    }
73
74
    /**
75
     * Renderiza el documento en el formato solicitado (HTML o PDF).
76
     *
77
     * @param AbstractDocumento $documento Documento a renderizar.
78
     * @param array $options Opciones para el renderizado.
79
     * @return string Datos del documento renderizado.
80
     */
81
    public function render(
82
        AbstractDocumento $documento,
83
        array $options = []
84
    ): string {
85
        // Plantilla que se renderizará.
86
        $template = $options['template'] ?? $this->getDefaultTemplate();
87
        if ($template[0] !== '/') {
88
            $template = 'dte/documento/' . $template;
89
        }
90
91
        // Datos que se usarán para renderizar.
92
        $data = $this->createData($documento, $options);
93
94
        // Renderizar el documento.
95
        $rendered = $this->rendererService->render($template, $data);
96
97
        // Entregar el contenido renderizado del documento.
98
        return $rendered;
99
    }
100
101
    /**
102
     * Crea los datos que se pasarán a la plantilla que se renderizará.
103
     *
104
     * @param AbstractDocumento $documento Documento a renderizar.
105
     * @param array $options Opciones para el renderizado.
106
     * @return array Datos que se pasarán a la plantilla al renderizar.
107
     */
108
    protected function createData(
109
        AbstractDocumento $documento,
110
        array $options = []
111
    ): array {
112
        // Preparar datos que se usarán para renderizar.
113
        $data = [
114
            'dte' => $documento->getData(),
115
            'options' => [
116
                'format' => $options['format'] ?? null,
117
                'config' => [
118
                    'html' => $options['html'] ?? null,
119
                    'pdf' => $options['pdf'] ?? null,
120
                ],
121
            ]
122
        ];
123
124
        // Entregar los datos que se pasarán a la plantilla.
125
        return $data;
126
    }
127
128
    /**
129
     * Entrega la plantilla por defecto asociada al renderizador del DTE.
130
     *
131
     * @return string Nombre de la plantilla por defecto.
132
     * @throws LogicException Si no existe una plantilla por defecto asignada en
133
     * el renderizador.
134
     */
135
    private function getDefaultTemplate(): string
136
    {
137
        if (!isset($this->defaultTemplate)) {
138
            throw new LogicException(
139
                'No se ha asignado una plantilla por defecto para el renderizado del DTE.'
140
            );
141
        }
142
143
        return $this->defaultTemplate;
144
    }
145
}
146