satcfdi.create.cfd.cfdi32.Comprobante.__init__()   B
last analyzed

Complexity

Conditions 1

Size

Total Lines 61
Code Lines 60

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 60
nop 29
dl 0
loc 61
rs 8.309
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
"""cfdi http://www.sat.gob.mx/cfd/3"""
2
from decimal import Decimal
3
from datetime import datetime, date, time
4
from collections.abc import Sequence
5
from ...cfdi import CFDI
6
from ...xelement import XElement
7
from ...utils import ScalarMap
8
9
10
class TInformacionAduanera(ScalarMap):
11
    """
12
    Tipo definido para expresar información aduanera
13
    
14
    :param numero: Atributo requerido para expresar el número del documento aduanero que ampara la importación del bien.
15
    :param fecha: Atributo requerido para expresar la fecha de expedición del documento aduanero que ampara la importación del bien. Se expresa en el formato aaaa-mm-dd
16
    :param aduana: Atributo opcional para precisar el nombre de la aduana por la que se efectuó la importación del bien.
17
    """
18
    
19
    def __init__(
20
            self,
21
            numero: str,
22
            fecha: date,
23
            aduana: str = None,
24
    ): 
25
        super().__init__({
26
            'Numero': numero,
27
            'Fecha': fecha,
28
            'Aduana': aduana,
29
        })
30
        
31
32 View Code Duplication
class TUbicacionFiscal(ScalarMap):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
33
    """
34
    Tipo definido para expresar domicilios o direcciones
35
    
36
    :param calle: Este atributo requerido sirve para precisar la avenida, calle, camino o carretera donde se da la ubicación.
37
    :param municipio: Atributo requerido que sirve para precisar el municipio o delegación (en el caso del Distrito Federal) en donde se da la ubicación.
38
    :param estado: Atributo requerido que sirve para precisar el estado o entidad federativa donde se da la ubicación.
39
    :param pais: Atributo requerido que sirve para precisar el país donde se da la ubicación.
40
    :param codigo_postal: Atributo requerido que sirve para asentar el código postal en donde se da la ubicación.
41
    :param no_exterior: Este atributo opcional sirve para expresar el número particular en donde se da la ubicación sobre una calle dada.
42
    :param no_interior: Este atributo opcional sirve para expresar información adicional para especificar la ubicación cuando calle y número exterior (noExterior) no resulten suficientes para determinar la ubicación de forma precisa.
43
    :param colonia: Este atributo opcional sirve para precisar la colonia en donde se da la ubicación cuando se desea ser más específico en casos de ubicaciones urbanas.
44
    :param localidad: Atributo opcional que sirve para precisar la ciudad o población donde se da la ubicación.
45
    :param referencia: Atributo opcional para expresar una referencia de ubicación adicional.
46
    """
47
    
48
    def __init__(
49
            self,
50
            calle: str,
51
            municipio: str,
52
            estado: str,
53
            pais: str,
54
            codigo_postal: str,
55
            no_exterior: str = None,
56
            no_interior: str = None,
57
            colonia: str = None,
58
            localidad: str = None,
59
            referencia: str = None,
60
    ): 
61
        super().__init__({
62
            'Calle': calle,
63
            'Municipio': municipio,
64
            'Estado': estado,
65
            'Pais': pais,
66
            'CodigoPostal': codigo_postal,
67
            'NoExterior': no_exterior,
68
            'NoInterior': no_interior,
69
            'Colonia': colonia,
70
            'Localidad': localidad,
71
            'Referencia': referencia,
72
        })
73
        
74
75
class TUbicacion(ScalarMap):
76
    """
77
    Tipo definido para expresar domicilios o direcciones
78
    
79
    :param pais: Atributo requerido que sirve para precisar el país donde se da la ubicación.
80
    :param calle: Este atributo opcional sirve para precisar la avenida, calle, camino o carretera donde se da la ubicación.
81
    :param no_exterior: Este atributo opcional sirve para expresar el número particular en donde se da la ubicación sobre una calle dada.
82
    :param no_interior: Este atributo opcional sirve para expresar información adicional para especificar la ubicación cuando calle y número exterior (noExterior) no resulten suficientes para determinar la ubicación de forma precisa.
83
    :param colonia: Este atributo opcional sirve para precisar la colonia en donde se da la ubicación cuando se desea ser más específico en casos de ubicaciones urbanas.
84
    :param localidad: Atributo opcional que sirve para precisar la ciudad o población donde se da la ubicación.
85
    :param referencia: Atributo opcional para expresar una referencia de ubicación adicional.
86
    :param municipio: Atributo opcional que sirve para precisar el municipio o delegación (en el caso del Distrito Federal) en donde se da la ubicación.
87
    :param estado: Atributo opcional que sirve para precisar el estado o entidad federativa donde se da la ubicación.
88
    :param codigo_postal: Atributo opcional que sirve para asentar el código postal en donde se da la ubicación.
89
    """
90
    
91
    def __init__(
92
            self,
93
            pais: str,
94
            calle: str = None,
95
            no_exterior: str = None,
96
            no_interior: str = None,
97
            colonia: str = None,
98
            localidad: str = None,
99
            referencia: str = None,
100
            municipio: str = None,
101
            estado: str = None,
102
            codigo_postal: str = None,
103
    ): 
104
        super().__init__({
105
            'Pais': pais,
106
            'Calle': calle,
107
            'NoExterior': no_exterior,
108
            'NoInterior': no_interior,
109
            'Colonia': colonia,
110
            'Localidad': localidad,
111
            'Referencia': referencia,
112
            'Municipio': municipio,
113
            'Estado': estado,
114
            'CodigoPostal': codigo_postal,
115
        })
116
        
117
118
class Traslado(ScalarMap):
119
    """
120
    Nodo para la información detallada de un traslado de impuesto específico
121
    
122
    :param impuesto: Atributo requerido para señalar el tipo de impuesto trasladado
123
    :param tasa: Atributo requerido para señalar la tasa del impuesto que se traslada por cada concepto amparado en el comprobante
124
    :param importe: Atributo requerido para señalar el importe del impuesto trasladado
125
    """
126
    
127
    def __init__(
128
            self,
129
            impuesto: str,
130
            tasa: Decimal | int,
131
            importe: Decimal | int,
132
    ): 
133
        super().__init__({
134
            'Impuesto': impuesto,
135
            'Tasa': tasa,
136
            'Importe': importe,
137
        })
138
        
139
140
class Retencion(ScalarMap):
141
    """
142
    Nodo para la información detallada de una retención de impuesto específico
143
    
144
    :param impuesto: Atributo requerido para señalar el tipo de impuesto retenido
145
    :param importe: Atributo requerido para señalar el importe o monto del impuesto retenido
146
    """
147
    
148
    def __init__(
149
            self,
150
            impuesto: str,
151
            importe: Decimal | int,
152
    ): 
153
        super().__init__({
154
            'Impuesto': impuesto,
155
            'Importe': importe,
156
        })
157
        
158
159
class Impuestos(ScalarMap):
160
    """
161
    Nodo requerido para capturar los impuestos aplicables.
162
    
163
    :param total_impuestos_retenidos: Atributo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el comprobante fiscal digital a través de Internet.
164
    :param total_impuestos_trasladados: Atributo opcional para expresar el total de los impuestos trasladados que se desprenden de los conceptos expresados en el comprobante fiscal digital a través de Internet.
165
    :param retenciones: Nodo opcional para capturar los impuestos retenidos aplicables
166
    :param traslados: Nodo opcional para asentar o referir los impuestos trasladados aplicables
167
    """
168
    
169
    def __init__(
170
            self,
171
            total_impuestos_retenidos: Decimal | int = None,
172
            total_impuestos_trasladados: Decimal | int = None,
173
            retenciones: Retencion | dict | Sequence[Retencion | dict] = None,
174
            traslados: Traslado | dict | Sequence[Traslado | dict] = None,
175
    ): 
176
        super().__init__({
177
            'TotalImpuestosRetenidos': total_impuestos_retenidos,
178
            'TotalImpuestosTrasladados': total_impuestos_trasladados,
179
            'Retenciones': retenciones,
180
            'Traslados': traslados,
181
        })
182
        
183
184 View Code Duplication
class Parte(ScalarMap):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
185
    """
186
    Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el comprobante fiscal digital a través de Internet
187
    
188
    :param cantidad: Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por la presente parte.
189
    :param descripcion: Atributo requerido para precisar la descripción del bien o servicio cubierto por la presente parte.
190
    :param unidad: Atributo opcional para precisar la unidad de medida aplicable para la cantidad expresada en la parte.
191
    :param no_identificacion: Atributo opcional para expresar el número de serie del bien o identificador del servicio amparado por la presente parte.
192
    :param valor_unitario: Atributo opcional para precisar el valor o precio unitario del bien o servicio cubierto por la presente parte.
193
    :param importe: Atributo opcional para precisar el importe total de los bienes o servicios de la presente parte. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en la parte.
194
    :param informacion_aduanera: Nodo opcional para introducir la información aduanera aplicable cuando se trate de partes o componentes importados vendidos de primera mano.
195
    """
196
    
197
    def __init__(
198
            self,
199
            cantidad: Decimal | int,
200
            descripcion: str,
201
            unidad: str = None,
202
            no_identificacion: str = None,
203
            valor_unitario: Decimal | int = None,
204
            importe: Decimal | int = None,
205
            informacion_aduanera: TInformacionAduanera | dict | Sequence[TInformacionAduanera | dict] = None,
206
    ): 
207
        super().__init__({
208
            'Cantidad': cantidad,
209
            'Descripcion': descripcion,
210
            'Unidad': unidad,
211
            'NoIdentificacion': no_identificacion,
212
            'ValorUnitario': valor_unitario,
213
            'Importe': importe,
214
            'InformacionAduanera': informacion_aduanera,
215
        })
216
        
217
218
class Concepto(ScalarMap):
219
    """
220
    Nodo para introducir la información detallada de un bien o servicio amparado en el comprobante.
221
    
222
    :param cantidad: Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por el presente concepto.
223
    :param unidad: Atributo requerido para precisar la unidad de medida aplicable para la cantidad expresada en el concepto.
224
    :param descripcion: Atributo requerido para precisar la descripción del bien o servicio cubierto por el presente concepto.
225
    :param valor_unitario: Atributo requerido para precisar el valor o precio unitario del bien o servicio cubierto por el presente concepto.
226
    :param importe: Atributo requerido para precisar el importe total de los bienes o servicios del presente concepto. Debe ser equivalente al resultado de multiplicar la cantidad por el valor unitario expresado en el concepto.
227
    :param no_identificacion: Atributo opcional para expresar el número de serie del bien o identificador del servicio amparado por el presente concepto.
228
    :param informacion_aduanera: Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas.
229
    :param cuenta_predial: Nodo opcional para asentar el número de cuenta predial con el que fue registrado el inmueble, en el sistema catastral de la entidad federativa de que trate, o bien para incorporar los datos de identificación del certificado de participación inmobiliaria no amortizable.
230
    :param complemento_concepto: Nodo opcional donde se incluirán los nodos complementarios de extensión al concepto, definidos por el SAT, de acuerdo a disposiciones particulares a un sector o actividad especifica.
231
    :param parte: Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el comprobante fiscal digital a través de Internet
232
    """
233
    
234
    def __init__(
235
            self,
236
            cantidad: Decimal | int,
237
            unidad: str,
238
            descripcion: str,
239
            valor_unitario: Decimal | int,
240
            importe: Decimal | int,
241
            no_identificacion: str = None,
242
            informacion_aduanera: TInformacionAduanera | dict | Sequence[TInformacionAduanera | dict] = None,
243
            cuenta_predial: str = None,
244
            complemento_concepto: XElement | Sequence[XElement] = None,
245
            parte: Parte | dict | Sequence[Parte | dict] = None,
246
    ): 
247
        super().__init__({
248
            'Cantidad': cantidad,
249
            'Unidad': unidad,
250
            'Descripcion': descripcion,
251
            'ValorUnitario': valor_unitario,
252
            'Importe': importe,
253
            'NoIdentificacion': no_identificacion,
254
            'InformacionAduanera': informacion_aduanera,
255
            'CuentaPredial': cuenta_predial,
256
            'ComplementoConcepto': complemento_concepto,
257
            'Parte': parte,
258
        })
259
        
260
261
class Receptor(ScalarMap):
262
    """
263
    Nodo requerido para precisar la información del contribuyente receptor del comprobante.
264
    
265
    :param rfc: Atributo requerido para precisar la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente receptor del comprobante.
266
    :param nombre: Atributo opcional para el nombre, denominación o razón social del contribuyente receptor del comprobante.
267
    :param domicilio: Nodo opcional para la definición de la ubicación donde se da el domicilio del receptor del comprobante fiscal.
268
    """
269
    
270
    def __init__(
271
            self,
272
            rfc: str,
273
            nombre: str = None,
274
            domicilio: TUbicacion | dict = None,
275
    ): 
276
        super().__init__({
277
            'Rfc': rfc,
278
            'Nombre': nombre,
279
            'Domicilio': domicilio,
280
        })
281
        
282
283
class Emisor(ScalarMap):
284
    """
285
    Nodo requerido para expresar la información del contribuyente emisor del comprobante.
286
    
287
    :param rfc: Atributo requerido para la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente emisor del comprobante sin guiones o espacios.
288
    :param regimen_fiscal: Nodo requerido para incorporar los regímenes en los que tributa el contribuyente emisor. Puede contener más de un régimen.
289
    :param nombre: Atributo opcional para el nombre, denominación o razón social del contribuyente emisor del comprobante.
290
    :param domicilio_fiscal: Nodo opcional para precisar la información de ubicación del domicilio fiscal del contribuyente emisor
291
    :param expedido_en: Nodo opcional para precisar la información de ubicación del domicilio en donde es emitido el comprobante fiscal en caso de que sea distinto del domicilio fiscal del contribuyente emisor.
292
    """
293
    
294
    def __init__(
295
            self,
296
            rfc: str,
297
            regimen_fiscal: str | Sequence[str],
298
            nombre: str = None,
299
            domicilio_fiscal: TUbicacionFiscal | dict = None,
300
            expedido_en: TUbicacion | dict = None,
301
    ): 
302
        super().__init__({
303
            'Rfc': rfc,
304
            'RegimenFiscal': regimen_fiscal,
305
            'Nombre': nombre,
306
            'DomicilioFiscal': domicilio_fiscal,
307
            'ExpedidoEn': expedido_en,
308
        })
309
        
310
311
class Comprobante(CFDI):
312
    """
313
    Estándar de Comprobante fiscal digital a través de Internet.
314
    
315
    :param fecha: Atributo requerido para la expresión de la fecha y hora de expedición del comprobante fiscal. Se expresa en la forma aaaa-mm-ddThh:mm:ss, de acuerdo con la especificación ISO 8601.
316
    :param sello: Atributo requerido para contener el sello digital del comprobante fiscal, al que hacen referencia las reglas de resolución miscelánea aplicable. El sello deberá ser expresado cómo una cadena de texto en formato Base 64.
317
    :param forma_de_pago: Atributo requerido para precisar la forma de pago que aplica para este comprobnante fiscal digital a través de Internet. Se utiliza para expresar Pago en una sola exhibición o número de parcialidad pagada contra el total de parcialidades, Parcialidad 1 de X.
318
    :param no_certificado: Atributo requerido para expresar el número de serie del certificado de sello digital que ampara al comprobante, de acuerdo al acuse correspondiente a 20 posiciones otorgado por el sistema del SAT.
319
    :param certificado: Atributo requerido que sirve para expresar el certificado de sello digital que ampara al comprobante como texto, en formato base 64.
320
    :param sub_total: Atributo requerido para representar la suma de los importes antes de descuentos e impuestos.
321
    :param total: Atributo requerido para representar la suma del subtotal, menos los descuentos aplicables, más los impuestos trasladados, menos los impuestos retenidos.
322
    :param tipo_de_comprobante: Atributo requerido para expresar el efecto del comprobante fiscal para el contribuyente emisor.
323
    :param metodo_de_pago: Atributo requerido de texto libre para expresar el método de pago de los bienes o servicios amparados por el comprobante. Se entiende como método de pago leyendas tales como: cheque, tarjeta de crédito o debito, depósito en cuenta, etc.
324
    :param lugar_expedicion: Atributo requerido para incorporar el lugar de expedición del comprobante.
325
    :param emisor: Nodo requerido para expresar la información del contribuyente emisor del comprobante.
326
    :param receptor: Nodo requerido para precisar la información del contribuyente receptor del comprobante.
327
    :param conceptos: Nodo requerido para enlistar los conceptos cubiertos por el comprobante.
328
    :param impuestos: Nodo requerido para capturar los impuestos aplicables.
329
    :param serie: Atributo opcional para precisar la serie para control interno del contribuyente. Este atributo acepta una cadena de caracteres alfabéticos de 1 a 25 caracteres sin incluir caracteres acentuados.
330
    :param folio: Atributo opcional para control interno del contribuyente que acepta un valor numérico entero superior a 0 que expresa el folio del comprobante.
331
    :param condiciones_de_pago: Atributo opcional para expresar las condiciones comerciales aplicables para el pago del comprobante fiscal digital a través de Internet.
332
    :param descuento: Atributo opcional para representar el importe total de los descuentos aplicables antes de impuestos.
333
    :param motivo_descuento: Atributo opcional para expresar el motivo del descuento aplicable.
334
    :param tipo_cambio: Atributo opcional para representar el tipo de cambio conforme a la moneda usada
335
    :param moneda: Atributo opcional para expresar la moneda utilizada para expresar los montos
336
    :param num_cta_pago: Atributo Opcional para incorporar al menos los cuatro últimos digitos del número de cuenta con la que se realizó el pago.
337
    :param folio_fiscal_orig: Atributo opcional para señalar el número de folio fiscal del comprobante que se hubiese expedido por el valor total del comprobante, tratándose del pago en parcialidades.
338
    :param serie_folio_fiscal_orig: Atributo opcional para señalar la serie del folio del comprobante que se hubiese expedido por el valor total del comprobante, tratándose del pago en parcialidades.
339
    :param fecha_folio_fiscal_orig: Atributo opcional para señalar la fecha de expedición del comprobante que se hubiese emitido por el valor total del comprobante, tratándose del pago en parcialidades. Se expresa en la forma aaaa-mm-ddThh:mm:ss, de acuerdo con la especificación ISO 8601.
340
    :param monto_folio_fiscal_orig: Atributo opcional para señalar el total del comprobante que se hubiese expedido por el valor total de la operación, tratándose del pago en parcialidades
341
    :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.
342
    :param addenda: Nodo opcional para recibir las extensiones al presente formato que sean de utilidad al contribuyente. Para las reglas de uso del mismo, referirse al formato de origen.
343
    """
344
    
345
    tag = '{http://www.sat.gob.mx/cfd/3}Comprobante'
346
    version = '3.2'
347
    
348
    def __init__(
349
            self,
350
            fecha: datetime,
351
            sello: str,
352
            forma_de_pago: str,
353
            no_certificado: str,
354
            certificado: str,
355
            sub_total: Decimal | int,
356
            total: Decimal | int,
357
            tipo_de_comprobante: str,
358
            metodo_de_pago: str,
359
            lugar_expedicion: str,
360
            emisor: Emisor | dict,
361
            receptor: Receptor | dict,
362
            conceptos: Concepto | dict | Sequence[Concepto | dict],
363
            impuestos: Impuestos | dict,
364
            serie: str = None,
365
            folio: str = None,
366
            condiciones_de_pago: str = None,
367
            descuento: Decimal | int = None,
368
            motivo_descuento: str = None,
369
            tipo_cambio: str = None,
370
            moneda: str = None,
371
            num_cta_pago: str = None,
372
            folio_fiscal_orig: str = None,
373
            serie_folio_fiscal_orig: str = None,
374
            fecha_folio_fiscal_orig: datetime = None,
375
            monto_folio_fiscal_orig: Decimal | int = None,
376
            complemento: XElement | Sequence[XElement] = None,
377
            addenda: XElement | Sequence[XElement] = None,
378
    ): 
379
        super().__init__({
380
            'Version': self.version,
381
            'Fecha': fecha,
382
            'Sello': sello,
383
            'FormaDePago': forma_de_pago,
384
            'NoCertificado': no_certificado,
385
            'Certificado': certificado,
386
            'SubTotal': sub_total,
387
            'Total': total,
388
            'TipoDeComprobante': tipo_de_comprobante,
389
            'MetodoDePago': metodo_de_pago,
390
            'LugarExpedicion': lugar_expedicion,
391
            'Emisor': emisor,
392
            'Receptor': receptor,
393
            'Conceptos': conceptos,
394
            'Impuestos': impuestos,
395
            'Serie': serie,
396
            'Folio': folio,
397
            'CondicionesDePago': condiciones_de_pago,
398
            'Descuento': descuento,
399
            'MotivoDescuento': motivo_descuento,
400
            'TipoCambio': tipo_cambio,
401
            'Moneda': moneda,
402
            'NumCtaPago': num_cta_pago,
403
            'FolioFiscalOrig': folio_fiscal_orig,
404
            'SerieFolioFiscalOrig': serie_folio_fiscal_orig,
405
            'FechaFolioFiscalOrig': fecha_folio_fiscal_orig,
406
            'MontoFolioFiscalOrig': monto_folio_fiscal_orig,
407
            'Complemento': complemento,
408
            'Addenda': addenda,
409
        })
410
        
411
412