FakeCafProvider   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 11
c 1
b 0
f 0
dl 0
loc 52
ccs 12
cts 12
cp 1
rs 10
wmc 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A retrieve() 0 22 3
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\Identifier\Service;
26
27
use libredte\lib\Core\Package\Billing\Component\Document\Contract\TipoDocumentoInterface;
28
use libredte\lib\Core\Package\Billing\Component\Identifier\Contract\CafBagInterface;
29
use libredte\lib\Core\Package\Billing\Component\Identifier\Contract\CafFakerWorkerInterface;
30
use libredte\lib\Core\Package\Billing\Component\Identifier\Contract\CafProviderInterface;
31
use libredte\lib\Core\Package\Billing\Component\TradingParties\Contract\EmisorInterface;
32
33
/**
34
 * Implementación de un proveedor de archivos CAF falsos.
35
 *
36
 * Esta implementación es solo para pruebas de LibreDTE. Cada aplicación deberá
37
 * implementar un servicio real de CafProviderInterface para que sea inyectado
38
 * donde sea necesario (ej: en emisión masiva).
39
 */
40
class FakeCafProvider implements CafProviderInterface
41
{
42
    /**
43
     * Historial de folios asignados.
44
     *
45
     * Permite entregar siempre folios diferentes para los emisores y tipos de
46
     * documentos. Así se evitan problemas de repetir folios. Esto es lo que
47
     * realmente debería implementar la aplicación que use LibreDTE: un control
48
     * de la asignación de folios.
49
     *
50
     * El arreglo guardará por cada emisor y tipo de documento el último folio
51
     * que fue entregado.
52
     *
53
     * @var array<int, array<int, int>>
54
     */
55
    private array $folios = [];
56
57
    /**
58
     * Constructor con dependencias del servicio.
59
     *
60
     * @param CafFakerWorkerInterface $cafFakerWorker
61
     */
62 53
    public function __construct(
63
        private CafFakerWorkerInterface $cafFakerWorker
64
    ) {
65 53
    }
66
67
    /**
68
     * {@inheritDoc}
69
     */
70 53
    public function retrieve(
71
        EmisorInterface $emisor,
72
        TipoDocumentoInterface $tipoDocumento,
73
        ?int $folio = null
74
    ): CafBagInterface {
75
        // Resolver el folio que corresponde usar.
76 53
        if ($folio === null) {
77 48
            if (!isset($this->folios[$emisor->getRutAsInt()][$tipoDocumento->getCodigo()])) {
78 48
                $this->folios[$emisor->getRutAsInt()][$tipoDocumento->getCodigo()] = 0;
79
            }
80 48
            $folio = $this->folios[$emisor->getRutAsInt()][$tipoDocumento->getCodigo()] + 1;
81
        }
82
83
        // Recordar el folio entregado.
84 53
        $this->folios[$emisor->getRutAsInt()][$tipoDocumento->getCodigo()] = $folio;
85
86
        // Crear la bolsa con el CAF falso para el emisor, tipo de documento y
87
        // folio determinado.
88 53
        return $this->cafFakerWorker->create(
89 53
            $emisor,
90 53
            $tipoDocumento->getCodigo(),
0 ignored issues
show
Bug introduced by
It seems like $tipoDocumento->getCodigo() can also be of type string; however, parameter $codigoDocumento of libredte\lib\Core\Packag...rkerInterface::create() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

90
            /** @scrutinizer ignore-type */ $tipoDocumento->getCodigo(),
Loading history...
91 53
            $folio
92 53
        );
93
    }
94
}
95