CfdiRetenRelacionados.__init__()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.125

Importance

Changes 0
Metric Value
cc 1
eloc 7
nop 3
dl 0
loc 15
ccs 1
cts 2
cp 0.5
crap 1.125
rs 10
c 0
b 0
f 0
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 ...cfdi import CFDI
7 1
from ...xelement import XElement
8 1
from ...utils import ScalarMap
9 1
from ...transform import get_timezone
10
11
12 1
class CfdiRetenRelacionados(ScalarMap):
13
    """
14
    http://www.sat.gob.mx/esquemas/retencionpago/2
15
    Nodo opcional para precisar la información de los comprobantes relacionados.
16
    """
17
18 1
    def __init__(
19
            self,
20
            tipo_relacion: str,
21
            uuid: str,
22
    ):
23
        """
24
        Nodo opcional para precisar la información de los comprobantes relacionados.
25
        
26
        :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.
27
        :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.
28
        """
29
30
        super().__init__({
31
            'TipoRelacion': tipo_relacion,
32
            'UUID': uuid,
33
        })
34
35
36 1
class ImpRetenidos(ScalarMap):
37
    """
38
    http://www.sat.gob.mx/esquemas/retencionpago/2
39
    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.
40
    """
41
42 1
    def __init__(
43
            self,
44
            monto_ret: Decimal | int,
45
            tipo_pago_ret: str,
46
            base_ret: Decimal | int = None,
47
            impuesto_ret: str = None,
48
    ):
49
        """
50
        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.
51
        
52
        :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.
53
        :param tipo_pago_ret: Atributo requerido para precisar la clave del tipo del efecto que se le da al monto de la retención.
54
        :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.
55
        :param impuesto_ret: Atributo opcional para señalar el tipo de impuesto retenido del período o ejercicio conforme al catálogo.
56
        """
57
58
        super().__init__({
59
            'MontoRet': monto_ret,
60
            'TipoPagoRet': tipo_pago_ret,
61
            'BaseRet': base_ret,
62
            'ImpuestoRet': impuesto_ret,
63
        })
64
65
66 1
class Totales(ScalarMap):
67
    """
68
    http://www.sat.gob.mx/esquemas/retencionpago/2
69
    Nodo requerido para expresar el total de las retenciones e información de los pagos efectuados en el período que ampara el comprobante.
70
    """
71
72 1
    def __init__(
73
            self,
74
            monto_tot_operacion: Decimal | int,
75
            monto_tot_grav: Decimal | int,
76
            monto_tot_exent: Decimal | int,
77
            monto_tot_ret: Decimal | int,
78
            utilidad_bimestral: Decimal | int = None,
79
            isr_correspondiente: Decimal | int = None,
80
            imp_retenidos: Sequence[ImpRetenidos | dict] = None,
81
    ):
82
        """
83
        Nodo requerido para expresar el total de las retenciones e información de los pagos efectuados en el período que ampara el comprobante.
84
        
85
        :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.
86
        :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.
87
        :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.
88
        :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.
89
        :param utilidad_bimestral: Atributo condicional para expresar el monto de la utilidad bimestral.
90
        :param isr_correspondiente: Atributo condicional para expresar el monto del ISR correspondiente al bimestre.
91
        :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.
92
        """
93
94
        super().__init__({
95
            'MontoTotOperacion': monto_tot_operacion,
96
            'MontoTotGrav': monto_tot_grav,
97
            'MontoTotExent': monto_tot_exent,
98
            'MontoTotRet': monto_tot_ret,
99
            'UtilidadBimestral': utilidad_bimestral,
100
            'ISRCorrespondiente': isr_correspondiente,
101
            'ImpRetenidos': imp_retenidos,
102
        })
103
104
105 1
class Periodo(ScalarMap):
106
    """
107
    http://www.sat.gob.mx/esquemas/retencionpago/2
108
    Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos.
109
    """
110
111 1
    def __init__(
112
            self,
113
            mes_ini: str,
114
            mes_fin: str,
115
            ejercicio: str,
116
    ):
117
        """
118
        Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos.
119
        
120
        :param mes_ini: Atributo requerido para expresar la clave del mes inicial del período de la retención e información de pagos.
121
        :param mes_fin: Atributo requerido para expresar la clave del mes final del período de la retención e información de pagos.
122
        :param ejercicio: Atributo requerido para la expresión del ejercicio fiscal (año) de la retención e información de pagos.
123
        """
124
125
        super().__init__({
126
            'MesIni': mes_ini,
127
            'MesFin': mes_fin,
128
            'Ejercicio': ejercicio,
129
        })
130
131
132 1
class Extranjero(ScalarMap):
133
    """
134
    http://www.sat.gob.mx/esquemas/retencionpago/2
135
    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.
136
    """
137
138 1
    def __init__(
139
            self,
140
            nom_den_raz_soc_r: str,
141
            num_reg_id_trib_r: str = None,
142
    ):
143
        """
144
        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.
145
        
146
        :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.
147
        :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.
148
        """
149
150
        super().__init__({
151
            'NomDenRazSocR': nom_den_raz_soc_r,
152
            'NumRegIdTribR': num_reg_id_trib_r,
153
        })
154
155
156 1
class Nacional(ScalarMap):
157
    """
158
    http://www.sat.gob.mx/esquemas/retencionpago/2
159
    Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana.
160
    """
161
162 1
    def __init__(
163
            self,
164
            rfc_r: str,
165
            nom_den_raz_soc_r: str,
166
            domicilio_fiscal_r: str,
167
            curp_r: str = None,
168
    ):
169
        """
170
        Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana.
171
        
172
        :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.
173
        :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.
174
        :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.
175
        :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.
176
        """
177
178
        super().__init__({
179
            'RfcR': rfc_r,
180
            'NomDenRazSocR': nom_den_raz_soc_r,
181
            'DomicilioFiscalR': domicilio_fiscal_r,
182
            'CurpR': curp_r,
183
        })
184
185
186 1
class Receptor(ScalarMap):
187
    """
188
    http://www.sat.gob.mx/esquemas/retencionpago/2
189
    Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
190
    """
191
192 1
    def __init__(
193
            self,
194
            nacionalidad_r: str,
195
            nacional: Nacional | dict = None,
196
            extranjero: Extranjero | dict = None,
197
    ):
198
        """
199
        Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
200
        
201
        :param nacionalidad_r: Atributo requerido para expresar la nacionalidad del receptor del comprobante que ampara retenciones e información de pagos.
202
        :param nacional: Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana.
203
        :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.
204
        """
205
206
        super().__init__({
207
            'NacionalidadR': nacionalidad_r,
208
            'Nacional': nacional,
209
            'Extranjero': extranjero,
210
        })
211
212
213 1
class Emisor(ScalarMap):
214
    """
215
    Nodo requerido para expresar la información del contribuyente emisor del comprobante que ampara retenciones e información de pagos.
216
217
    :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.
218
    :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.
219
    :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.
220
    """
221
222 1
    def __init__(
223
            self,
224
            rfc_e: str,
225
            nom_den_raz_soc_e: str,
226
            regimen_fiscal_e: str,
227
    ):
228
        super().__init__({
229
            'RfcE': rfc_e,
230
            'NomDenRazSocE': nom_den_raz_soc_e,
231
            'RegimenFiscalE': regimen_fiscal_e,
232
        })
233
234
235 1 View Code Duplication
class Retenciones(CFDI):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
236
    """
237
    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).
238
    """
239 1
    tag = '{http://www.sat.gob.mx/esquemas/retencionpago/2}Retenciones'
240 1
    version = '2.0'
241
242 1
    def __init__(
243
            self,
244
            lugar_exp_retenc: str,
245
            cve_retenc: str,
246
            emisor: Emisor | dict,
247
            receptor: Receptor | dict,
248
            periodo: Periodo | dict,
249
            totales: Totales | dict,
250
            folio_int: str = None,
251
            desc_retenc: str = None,
252
            cfdi_reten_relacionados: CfdiRetenRelacionados | dict = None,
253
            complemento: XElement | Sequence[XElement] = None,
254
            addenda: XElement | Sequence[XElement] = None,
255
            fecha_exp: datetime = None,
256
    ):
257
        """
258
        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).
259
260
        :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.
261
        :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.
262
        :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.
263
        :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.
264
        :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.
265
        :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.
266
        :param emisor: Nodo requerido para expresar la información del contribuyente emisor del comprobante que ampara retenciones e información de pagos.
267
        :param receptor: Nodo requerido para expresar la información del contribuyente receptor del comprobante que ampara retenciones e información de pagos.
268
        :param periodo: Nodo requerido para expresar el período que corresponde al comprobante que ampara retenciones e información de pagos.
269
        :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.
270
        :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.
271
        :param desc_retenc: Atributo condicional que expresa la descripción de la retención e información de pagos.
272
        :param cfdi_reten_relacionados: Nodo opcional para precisar la información de los comprobantes relacionados.
273
        :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.
274
        :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.
275
        """
276
277
        fecha_exp = fecha_exp or datetime.now(tz=get_timezone(lugar_exp_retenc)).replace(tzinfo=None)
278
        super().__init__({
279
            'Version': self.version,
280
            'Sello': '',
281
            'FechaExp': fecha_exp,
282
            'LugarExpRetenc': lugar_exp_retenc,
283
            'CveRetenc': cve_retenc,
284
            'FolioInt': folio_int,
285
            'DescRetenc': desc_retenc,
286
            'CfdiRetenRelacionados': cfdi_reten_relacionados,
287
            'Emisor': emisor,
288
            'Receptor': receptor,
289
            'Periodo': periodo,
290
            'Totales': totales,
291
            'Complemento': complemento,
292
            'Addenda': addenda,
293
        })
294
295 1
    def sign(self, signer: Signer):
296
        self['NoCertificado'] = signer.certificate_number,
297
        self['Certificado'] = signer.certificate_base64(),
298
        self['Sello'] = signer.sign_sha256(
299
            self.cadena_original().encode()
300
        )
301