Passed
Push — main ( d75dc3...69fdfe )
by Sat CFDI
04:58
created

Retenciones.__init__()   A

Complexity

Conditions 1

Size

Total Lines 51
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.2963

Importance

Changes 0
Metric Value
cc 1
eloc 30
nop 13
dl 0
loc 51
ccs 1
cts 3
cp 0.3333
crap 1.2963
rs 9.16
c 0
b 0
f 0

How to fix   Long Method    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1 1
from collections.abc import *
2 1
from datetime import datetime
3 1
from decimal import Decimal
4
5 1
from .. import Signer
6 1
from ... import CFDI, XElement, ScalarMap
7 1
from ...transform import get_timezone
8
9
10 1
class CfdiRetenRelacionados(ScalarMap):
11
    """
12
    http://www.sat.gob.mx/esquemas/retencionpago/2
13
    Nodo opcional para precisar la información de los comprobantes relacionados.
14
    """
15
16 1
    def __init__(
17
            self,
18
            tipo_relacion: str,
19
            uuid: str,
20
    ):
21
        """
22
        Nodo opcional para precisar la información de los comprobantes relacionados.
23
        
24
        :param tipo_relacion: Atributo requerido para indicar la clave de la relación que existe entre éste que se está generando y el comprobante que ampara retenciones e información de pagos previos.
25
        :param uuid: Atributo requerido para registrar el folio fiscal (UUID) de un comprobante que ampara retención e información de pagos, relacionado con el presente comprobante, ejemplo: Si éste sustituye a un comprobante cancelado.
26
        """
27
28
        super().__init__({
29
            'TipoRelacion': tipo_relacion,
30
            'UUID': uuid,
31
        })
32
33
34 1
class ImpRetenidos(ScalarMap):
35
    """
36
    http://www.sat.gob.mx/esquemas/retencionpago/2
37
    Nodo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el comprobante que ampara retenciones e información de pagos.
38
    """
39
40 1
    def __init__(
41
            self,
42
            monto_ret: Decimal | int,
43
            tipo_pago_ret: str,
44
            base_ret: Decimal | int = None,
45
            impuesto_ret: str = None,
46
    ):
47
        """
48
        Nodo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el comprobante que ampara retenciones e información de pagos.
49
        
50
        :param monto_ret: Atributo requerido para expresar el importe del impuesto retenido en el período o ejercicio que se relaciona en el comprobante que ampara retenciones e información de pagos. No se permiten valores negativos.
51
        :param tipo_pago_ret: Atributo requerido para precisar la clave del tipo del efecto que se le da al monto de la retención.
52
        :param base_ret: Atributo opcional para expresar la base del impuesto, que puede ser la diferencia entre los ingresos percibidos y las deducciones autorizadas. No se permiten valores negativos.
53
        :param impuesto_ret: Atributo opcional para señalar el tipo de impuesto retenido del período o ejercicio conforme al catálogo.
54
        """
55
56
        super().__init__({
57
            'MontoRet': monto_ret,
58
            'TipoPagoRet': tipo_pago_ret,
59
            'BaseRet': base_ret,
60
            'ImpuestoRet': impuesto_ret,
61
        })
62
63
64 1
class Totales(ScalarMap):
65
    """
66
    http://www.sat.gob.mx/esquemas/retencionpago/2
67
    Nodo requerido para expresar el total de las retenciones e información de los pagos efectuados en el período que ampara el comprobante.
68
    """
69
70 1
    def __init__(
71
            self,
72
            monto_tot_operacion: Decimal | int,
73
            monto_tot_grav: Decimal | int,
74
            monto_tot_exent: Decimal | int,
75
            monto_tot_ret: Decimal | int,
76
            utilidad_bimestral: Decimal | int = None,
77
            isr_correspondiente: Decimal | int = None,
78
            imp_retenidos: Sequence[ImpRetenidos | dict] = None,
79
    ):
80
        """
81
        Nodo requerido para expresar el total de las retenciones e información de los pagos efectuados en el período que ampara el comprobante.
82
        
83
        :param monto_tot_operacion: Atributo requerido para expresar el total del monto de la operación que se relaciona en el comprobante que ampara retenciones e información de pagos. No se permiten valores negativos.
84
        :param monto_tot_grav: Atributo requerido para expresar el total del monto gravado de la operación que se relaciona en el comprobante que ampara retenciones e información de pagos. No se permiten valores negativos.
85
        :param monto_tot_exent: Atributo requerido para expresar el total del monto exento de la operación que se relaciona en el comprobante que ampara retenciones e información de pagos. No se permiten valores negativos.
86
        :param monto_tot_ret: Atributo requerido para expresar el monto total de las retenciones. Sumatoria de los montos de retención del nodo ImpRetenidos. No se permiten valores negativos.
87
        :param utilidad_bimestral: Atributo condicional para expresar el monto de la utilidad bimestral.
88
        :param isr_correspondiente: Atributo condicional para expresar el monto del ISR correspondiente al bimestre.
89
        :param imp_retenidos: Nodo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el comprobante que ampara retenciones e información de pagos.
90
        """
91
92
        super().__init__({
93
            'MontoTotOperacion': monto_tot_operacion,
94
            'MontoTotGrav': monto_tot_grav,
95
            'MontoTotExent': monto_tot_exent,
96
            'MontoTotRet': monto_tot_ret,
97
            'UtilidadBimestral': utilidad_bimestral,
98
            'ISRCorrespondiente': isr_correspondiente,
99
            'ImpRetenidos': imp_retenidos,
100
        })
101
102
103 1
class Periodo(ScalarMap):
104
    """
105
    http://www.sat.gob.mx/esquemas/retencionpago/2
106
    Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos.
107
    """
108
109 1
    def __init__(
110
            self,
111
            mes_ini: str,
112
            mes_fin: str,
113
            ejercicio: str,
114
    ):
115
        """
116
        Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos.
117
        
118
        :param mes_ini: Atributo requerido para expresar la clave del mes inicial del período de la retención e información de pagos.
119
        :param mes_fin: Atributo requerido para expresar la clave del mes final del período de la retención e información de pagos.
120
        :param ejercicio: Atributo requerido para la expresión del ejercicio fiscal (año) de la retención e información de pagos.
121
        """
122
123
        super().__init__({
124
            'MesIni': mes_ini,
125
            'MesFin': mes_fin,
126
            'Ejercicio': ejercicio,
127
        })
128
129
130 1
class Extranjero(ScalarMap):
131
    """
132
    http://www.sat.gob.mx/esquemas/retencionpago/2
133
    Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos, cuando sea residente en el extranjero.
134
    """
135
136 1
    def __init__(
137
            self,
138
            nom_den_raz_soc_r: str,
139
            num_reg_id_trib_r: str = None,
140
    ):
141
        """
142
        Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos, cuando sea residente en el extranjero.
143
        
144
        :param nom_den_raz_soc_r: Atributo requerido para expresar el nombre, denominación o razón social del receptor del comprobante que ampara retenciones e información de pagos, cuando sea residente en el extranjero.
145
        :param num_reg_id_trib_r: Atributo opcional para expresar el número de registro de identificación fiscal del receptor del comprobante que ampara retenciones e información de pagos, cuando sea residente en el extranjero.
146
        """
147
148
        super().__init__({
149
            'NomDenRazSocR': nom_den_raz_soc_r,
150
            'NumRegIdTribR': num_reg_id_trib_r,
151
        })
152
153
154 1
class Nacional(ScalarMap):
155
    """
156
    http://www.sat.gob.mx/esquemas/retencionpago/2
157
    Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana.
158
    """
159
160 1
    def __init__(
161
            self,
162
            rfc_r: str,
163
            nom_den_raz_soc_r: str,
164
            domicilio_fiscal_r: str,
165
            curp_r: str = None,
166
    ):
167
        """
168
        Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana.
169
        
170
        :param rfc_r: Atributo requerido para registrar la clave del Registro Federal de Contribuyentes correspondiente al contribuyente receptor del comprobante que ampara retenciones e información de pagos.
171
        :param nom_den_raz_soc_r: Atributo requerido para registrar el(los) nombre(s), primer apellido, segundo apellido, según corresponda, denominación o razón social del contribuyente, inscrito en el RFC, del receptor del comprobante que ampara retenciones e información de pagos.
172
        :param domicilio_fiscal_r: Atributo requerido para registrar el código postal del domicilio fiscal del receptor del comprobante que ampara retenciones e información de pagos.
173
        :param curp_r: Atributo opcional para la Clave Única del Registro Poblacional del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
174
        """
175
176
        super().__init__({
177
            'RfcR': rfc_r,
178
            'NomDenRazSocR': nom_den_raz_soc_r,
179
            'DomicilioFiscalR': domicilio_fiscal_r,
180
            'CurpR': curp_r,
181
        })
182
183
184 1
class Receptor(ScalarMap):
185
    """
186
    http://www.sat.gob.mx/esquemas/retencionpago/2
187
    Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
188
    """
189
190 1
    def __init__(
191
            self,
192
            nacionalidad_r: str,
193
            nacional: Nacional | dict = None,
194
            extranjero: Extranjero | dict = None,
195
    ):
196
        """
197
        Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
198
        
199
        :param nacionalidad_r: Atributo requerido para expresar la nacionalidad del receptor del comprobante que ampara retenciones e información de pagos.
200
        :param nacional: Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana.
201
        :param extranjero: Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos, cuando sea residente en el extranjero.
202
        """
203
204
        super().__init__({
205
            'NacionalidadR': nacionalidad_r,
206
            'Nacional': nacional,
207
            'Extranjero': extranjero,
208
        })
209
210
211 1
class Emisor(ScalarMap):
212
    """
213
    Nodo requerido para expresar la información del contribuyente emisor del comprobante que ampara retenciones e información de pagos.
214
215
    :param rfc_e: Atributo requerido para registrar la clave del Registro Federal de Contribuyentes correspondiente al contribuyente emisor del comprobante que ampara retenciones e información de pagos, sin guiones o espacios.
216
    :param nom_den_raz_soc_e: Atributo requerido para registrar el nombre, denominación o razón social del contribuyente inscrito en el RFC, emisor del comprobante que ampara retenciones e información de pagos.
217
    :param regimen_fiscal_e: Atributo requerido para incorporar la clave del régimen del contribuyente emisor del comprobante que ampara retenciones e información de pagos.
218
    """
219
220 1
    def __init__(
221
            self,
222
            rfc_e: str,
223
            nom_den_raz_soc_e: str,
224
            regimen_fiscal_e: str,
225
    ):
226
        super().__init__({
227
            'RfcE': rfc_e,
228
            'NomDenRazSocE': nom_den_raz_soc_e,
229
            'RegimenFiscalE': regimen_fiscal_e,
230
        })
231
232
233 1
class Retenciones(CFDI):
234
    """
235
    Estándar del Comprobante Fiscal Digital por Internet que ampara retenciones e información de pagos. Los importes se expresan en la moneda de pesos mexicanos (MXN).
236
    """
237 1
    tag = '{http://www.sat.gob.mx/esquemas/retencionpago/2}Retenciones'
238 1
    version = '2.0'
239
240 1
    def __init__(
241
            self,
242
            lugar_exp_retenc: str,
243
            cve_retenc: str,
244
            emisor: Emisor | dict,
245
            receptor: Receptor | dict,
246
            periodo: Periodo | dict,
247
            totales: Totales | dict,
248
            folio_int: str = None,
249
            desc_retenc: str = None,
250
            cfdi_reten_relacionados: CfdiRetenRelacionados | dict = None,
251
            complemento: XElement | Sequence[XElement] = None,
252
            addenda: XElement | Sequence[XElement] = None,
253
            fecha_exp: datetime = None,
254
    ):
255
        """
256
        Estándar del Comprobante Fiscal Digital por Internet que ampara retenciones e información de pagos. Los importes se expresan en la moneda de pesos mexicanos (MXN).
257
258
        :param sello: Atributo requerido para contener el sello digital del comprobante que ampara retenciones e información de pagos, al que hacen referencia las reglas de resolución miscelánea vigente. El sello debe ser expresado como una cadena de texto en formato Base 64.
259
        :param no_certificado: Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante de retención e información de pagos, de acuerdo con el acuse correspondiente a 20 posiciones otorgado por el sistema del SAT.
260
        :param certificado: Atributo requerido que sirve para incorporar el certificado de sello digital que ampara el comprobante de retención e información de pagos. El certificado debe ser expresado como una cadena de texto en formato Base 64.
261
        :param fecha_exp: Atributo requerido para la expresión de la fecha y hora de expedición del comprobante que ampara retenciones e información de pagos. Se expresa en la forma AAAA-MM-DDThh:mm:ss y debe corresponder con la hora local donde se expide el comprobante.
262
        :param lugar_exp_retenc: Atributo requerido para incorporar el código postal del lugar de expedición del comprobante que ampara retenciones e información de pagos.
263
        :param cve_retenc: Atributo requerido para expresar la clave de la retención e información de pagos de acuerdo al catálogo publicado en internet por el SAT.
264
        :param emisor: Nodo requerido para expresar la información del contribuyente emisor del comprobante que ampara retenciones e información de pagos.
265
        :param receptor: Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
266
        :param periodo: Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos.
267
        :param totales: Nodo requerido para expresar el total de las retenciones e información de los pagos efectuados en el período que ampara el comprobante.
268
        :param folio_int: Atributo opcional para control interno del contribuyente que expresa el folio del comprobante que ampara retenciones e información de pagos. Permite números y/o letras.
269
        :param desc_retenc: Atributo condicional que expresa la descripción de la retención e información de pagos.
270
        :param cfdi_reten_relacionados: Nodo opcional para precisar la información de los comprobantes relacionados.
271
        :param complemento: Nodo opcional donde se incluirá el complemento Timbre Fiscal Digital de manera obligatoria y los nodos complementarios determinados por el SAT, de acuerdo a las disposiciones particulares a un sector o actividad específica.
272
        :param addenda: Nodo opcional para recibir las extensiones al formato que sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato de origen.
273
        """
274
275
        fecha_exp = fecha_exp or datetime.now(tz=get_timezone(lugar_exp_retenc)).replace(tzinfo=None)
276
        super().__init__({
277
            'Version': self.version,
278
            'Sello': '',
279
            'FechaExp': fecha_exp,
280
            'LugarExpRetenc': lugar_exp_retenc,
281
            'CveRetenc': cve_retenc,
282
            'FolioInt': folio_int,
283
            'DescRetenc': desc_retenc,
284
            'CfdiRetenRelacionados': cfdi_reten_relacionados,
285
            'Emisor': emisor,
286
            'Receptor': receptor,
287
            'Periodo': periodo,
288
            'Totales': totales,
289
            'Complemento': complemento,
290
            'Addenda': addenda,
291
        })
292
293 1
    def sign(self, signer: Signer):
294
        self['NoCertificado'] = signer.certificate_number,
295
        self['Certificado'] = signer.certificate_base64(),
296
        self['Sello'] = signer.sign_sha256(
297
            self.cadena_original().encode()
298
        )
299