BheEmitidas::listarBhesEmitidas()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 28
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 16
c 1
b 0
f 0
nc 3
nop 4
dl 0
loc 28
ccs 0
cts 21
cp 0
crap 12
rs 9.7333
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * API Gateway: Cliente de API en PHP.
7
 * Copyright (C) API Gateway <https://www.apigateway.cl>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la GNU Lesser General Public License (LGPL) 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 GNU Lesser General
17
 * Public License (LGPL) para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la GNU Lesser General Public License
20
 * (LGPL) junto a este programa. En caso contrario, consulte
21
 * <http://www.gnu.org/licenses/lgpl.html>.
22
 */
23
24
namespace apigatewaycl\api_client\sii;
25
26
use apigatewaycl\api_client\ApiBase;
27
use Psr\Http\Message\ResponseInterface;
28
29
/*
30
 * Módulo para interactuar con Boletas de Honorarios Electrónicas emitidas del SII.
31
 *
32
 * Para más información sobre la API, consulte la `documentación completa de
33
 * las BHE <https://developers.apigateway.cl/#6181f73d-3ffa-4940-a2f3-1ac3607536ec>`_.
34
 */
35
class BheEmitidas extends ApiBase
36
{
37
    // Quién debe hacer la retención asociada al honorario para pagar al SII
38
    /**
39
     * Constante de causa de retención por parte del emisor.
40
     * @var int
41
     */
42
    public const RETENCION_RECEPTOR = 1;
43
44
    /**
45
     * Constante de causa de retención por parte del receptor.
46
     * @var int
47
     */
48
    public const RETENCION_EMISOR = 2;
49
50
    // Posibles motivos de anulación de una BHE
51
    /**
52
     * Constante de motivo de anulación de BHE por no pago.
53
     * @var int
54
     */
55
    public const ANULACION_CAUSA_SIN_PAGO = 1;
56
57
    /**
58
     * Constante de motivo de anulación de BHE por no tener prestación.
59
     * @var int
60
     */
61
    public const ANULACION_CAUSA_SIN_PRESTACION = 2;
62
63
    /**
64
     * Constante de motivo de anulación de BHE por error de digitación.
65
     * @var int
66
     */
67
    public const ANULACION_CAUSA_ERROR_DIGITACION = 3;
68
69
    /**
70
     * Cliente específico para gestionar Boletas de Honorarios Electrónicas
71
     * (BHE) emitidas.
72
     *
73
     * Provee métodos para emitir, anular, y consultar información relacionada
74
     * con BHEs.
75
     *
76
     * @param array $credenciales Credenciales de autenticación.
77
     * @param string|null $token Token de autenticación para la API.
78
     * @param string|null $url URL base para la API.
79
     */
80
    public function __construct(
81
        array $credenciales,
82
        string $token = null,
83
        string $url = null
84
    ) {
85
        parent::__construct(
86
            credenciales: $credenciales,
87
            token: $token,
88
            url: $url
89
        );
90
    }
91
92
    /**
93
     * Obtiene los documentos de BHE emitidos por un emisor en un periodo específico.
94
     *
95
     * @param string $emisor RUT del emisor de las boletas.
96
     * @param string $periodo Período de tiempo de las boletas emitidas.
97
     * @param int|null $pagina Número de página para paginación (opcional).
98
     * @param string|null $pagina_sig_codigo Código para la siguiente
99
     * página (opcional).
100
     * @return \Psr\Http\Message\ResponseInterface Respuesta JSON con los
101
     * documentos de BHE.
102
     */
103
    public function listarBhesEmitidas(
104
        string $emisor,
105
        string $periodo,
106
        int $pagina = null,
107
        string $pagina_sig_codigo = null
108
    ): ResponseInterface {
109
        $url = sprintf(
110
            '/sii/bhe/emitidas/documentos/%s/%s',
111
            $emisor,
112
            $periodo
113
        );
114
        if ($pagina != null) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $pagina of type integer|null against null; this is ambiguous if the integer can be zero. Consider using a strict comparison !== instead.
Loading history...
115
            $url = sprintf(
116
                $url.'?pagina=%d',
117
                $pagina
118
            );
119
            if ($pagina_sig_codigo != null) {
0 ignored issues
show
Bug introduced by
It seems like you are loosely comparing $pagina_sig_codigo of type null|string against null; this is ambiguous if the string can be empty. Consider using a strict comparison !== instead.
Loading history...
120
                $url = sprintf(
121
                    $url.'&pagina_sig_codigo=%s',
122
                    $pagina_sig_codigo ?? '0'
123
                );
124
            }
125
        }
126
        $body = [
127
            'auth' => $this->getAuthPass(),
128
        ];
129
        $response = $this->post(resource: $url, data: $body);
130
        return $response;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $response could return the type null which is incompatible with the type-hinted return Psr\Http\Message\ResponseInterface. Consider adding an additional type-check to rule them out.
Loading history...
131
    }
132
133
    /**
134
     * Emite una nueva Boleta de Honorarios Electrónica.
135
     *
136
     * @param array $boleta Información detallada de la boleta a emitir.
137
     * @return \Psr\Http\Message\ResponseInterface Respuesta JSON con la
138
     * confirmación de la emisión de la BHE.
139
     */
140
    public function emitirBhe(array $boleta): ResponseInterface
141
    {
142
        $url = '/sii/bhe/emitidas/emitir';
143
        $body = [
144
            'auth' => $this->getAuthPass(),
145
            'boleta' => $boleta,
146
        ];
147
148
        $response = $this->post(resource: $url, data: $body);
149
150
        return $response;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $response could return the type null which is incompatible with the type-hinted return Psr\Http\Message\ResponseInterface. Consider adding an additional type-check to rule them out.
Loading history...
151
    }
152
153
    /**
154
     * Obtiene el PDF de una BHE emitida.
155
     *
156
     * @param string $codigo Código único de la BHE.
157
     * @return \Psr\Http\Message\ResponseInterface Contenido del PDF de la BHE.
158
     */
159
    public function descargarPdfBheEmitida(string $codigo): ResponseInterface
160
    {
161
        $url = sprintf(
162
            '/sii/bhe/emitidas/pdf/%s',
163
            $codigo
164
        );
165
        $body = [
166
            'auth' => $this->getAuthPass(),
167
        ];
168
        $response = $this->post(resource: $url, data: $body);
169
170
        return $response;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $response could return the type null which is incompatible with the type-hinted return Psr\Http\Message\ResponseInterface. Consider adding an additional type-check to rule them out.
Loading history...
171
    }
172
173
    /**
174
     * Envía por correo electrónico una BHE emitida.
175
     *
176
     * @param string $codigo Código único de la BHE a enviar.
177
     * @param string $email Dirección de correo electrónico a la cual enviar la BHE.
178
     * @return \Psr\Http\Message\ResponseInterface Respuesta JSON con la
179
     * confirmación del envío del email.
180
     */
181
    public function enviarEmailBheEmitida(
182
        string $codigo,
183
        string $email
184
    ): ResponseInterface {
185
        $url = sprintf(
186
            '/sii/bhe/emitidas/email/%s',
187
            $codigo
188
        );
189
        $body = [
190
            'auth' => $this->getAuthPass(),
191
            'destinatario' => ['email' => $email],
192
        ];
193
        $response = $this->post(resource: $url, data: $body);
194
195
        return $response;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $response could return the type null which is incompatible with the type-hinted return Psr\Http\Message\ResponseInterface. Consider adding an additional type-check to rule them out.
Loading history...
196
    }
197
198
    /**
199
     * Anula una BHE emitida.
200
     *
201
     * @param string $emisor RUT del emisor de la boleta.
202
     * @param string $folio Número de folio de la boleta.
203
     * @param int $causa Motivo de anulación de la boleta.
204
     * @return \Psr\Http\Message\ResponseInterface Respuesta JSON con la
205
     * confirmación de la anulación de la BHE.
206
     */
207
    public function anularBheEmitida(
208
        string $emisor,
209
        string $folio,
210
        int $causa = self::ANULACION_CAUSA_ERROR_DIGITACION
211
    ) {
212
        $url = sprintf(
213
            '/sii/bhe/emitidas/anular/%s/%s?causa=%d',
214
            $emisor,
215
            $folio,
216
            $causa
217
        );
218
        $body = [
219
            'auth' => $this->getAuthPass(),
220
        ];
221
        $response = $this->post(resource: $url, data: $body);
222
223
        return $response;
224
    }
225
}
226