Issues (158)

satcfdi/create/retencion/retenciones10.py (1 issue)

1
from collections.abc import *
2
from datetime import datetime, timedelta, timezone
3
from decimal import Decimal
4
5
from ...cfdi import CFDI
6
from ...models import Signer
7
from ...xelement import XElement
8
from ...utils import ScalarMap
9
10
11
class ImpRetenidos(ScalarMap):
12
    """
13
    http://www.sat.gob.mx/esquemas/retencionpago/1
14
    Nodo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el documento de retenciones e información de pagos.
15
    """
16
    def __init__(
17
            self,
18
            monto_ret: Decimal | int,
19
            tipo_pago_ret: str,
20
            base_ret: Decimal | int = None,
21
            impuesto: str = None,
22
    ): 
23
        """
24
        Nodo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el documento de retenciones e información de pagos.
25
        
26
        :param monto_ret: Atributo requerido para expresar el importe del impuesto retenido en el periodo o ejercicio
27
        :param tipo_pago_ret: Atributo requerido para precisar si el monto de la retención es considerado pago definitivo o pago provisional
28
        :param base_ret: Atributo opcional para expresar la  base del impuesto, que puede ser la diferencia entre los ingresos percibidos y las deducciones autorizadas
29
        :param impuesto: Atributo opcional para señalar el tipo de impuesto retenido del periodo o ejercicio conforme al catálogo.
30
        """
31
        
32
        super().__init__({
33
            'MontoRet': monto_ret,
34
            'TipoPagoRet': tipo_pago_ret,
35
            'BaseRet': base_ret,
36
            'Impuesto': impuesto,
37
        })
38
        
39
40
class Totales(ScalarMap):
41
    """
42
    http://www.sat.gob.mx/esquemas/retencionpago/1
43
    Nodo requerido para expresar el total de las retenciones e información de pagos efectuados en el período que ampara el documento.
44
    """
45
    def __init__(
46
            self,
47
            monto_tot_operacion: Decimal | int,
48
            monto_tot_grav: Decimal | int,
49
            monto_tot_exent: Decimal | int,
50
            monto_tot_ret: Decimal | int,
51
            imp_retenidos: Sequence[ImpRetenidos | dict] = None,
52
    ): 
53
        """
54
        Nodo requerido para expresar el total de las retenciones e información de pagos efectuados en el período que ampara el documento.
55
        
56
        :param monto_tot_operacion: Atributo requerido para expresar  el total del monto de la operación  que se relaciona en el comprobante 
57
        :param monto_tot_grav: Atributo requerido para expresar el total del monto gravado de la operación  que se relaciona en el comprobante.
58
        :param monto_tot_exent: Atributo requerido para expresar el total del monto exento de la operación  que se relaciona en el comprobante.
59
        :param monto_tot_ret: Atributo requerido para expresar el monto total de las retenciones. Sumatoria de los montos de retención del nodo ImpRetenidos.
60
        :param imp_retenidos: Nodo opcional para expresar el total de los impuestos retenidos que se desprenden de los conceptos expresados en el documento de retenciones e información de pagos.
61
        """
62
        
63
        super().__init__({
64
            'MontoTotOperacion': monto_tot_operacion,
65
            'MontoTotGrav': monto_tot_grav,
66
            'MontoTotExent': monto_tot_exent,
67
            'MontoTotRet': monto_tot_ret,
68
            'ImpRetenidos': imp_retenidos,
69
        })
70
        
71
72
class Periodo(ScalarMap):
73
    """
74
    http://www.sat.gob.mx/esquemas/retencionpago/1
75
    Nodo requerido para expresar el periodo que ampara el documento de retenciones e información de pagos
76
    """
77
    def __init__(
78
            self,
79
            mes_ini: int,
80
            mes_fin: int,
81
            ejerc: int,
82
    ): 
83
        """
84
        Nodo requerido para expresar el periodo que ampara el documento de retenciones e información de pagos
85
        
86
        :param mes_ini: Atributo requerido para la expresión del mes inicial del periodo de la retención e información de pagos
87
        :param mes_fin: Atributo requerido para la expresión del mes final del periodo de la retención e información de pagos
88
        :param ejerc: Atributo requerido para la expresión del ejercicio fiscal (año) 
89
        """
90
        
91
        super().__init__({
92
            'MesIni': mes_ini,
93
            'MesFin': mes_fin,
94
            'Ejerc': ejerc,
95
        })
96
        
97
98
class Extranjero(ScalarMap):
99
    """
100
    http://www.sat.gob.mx/esquemas/retencionpago/1
101
    Nodo requerido para expresar la información del contribuyente receptor del documento cuando sea residente en el extranjero
102
    """
103
    def __init__(
104
            self,
105
            nom_den_raz_soc_r: str,
106
            num_reg_id_trib: str = None,
107
    ): 
108
        """
109
        Nodo requerido para expresar la información del contribuyente receptor del documento cuando sea residente en el extranjero
110
        
111
        :param nom_den_raz_soc_r: Atributo requerido para expresar el nombre, denominación o razón social del receptor del documento cuando sea residente en el extranjero
112
        :param num_reg_id_trib: Atributo opcional para expresar el número de registro de identificación fiscal del receptor del documento cuando sea residente en el extranjero
113
        """
114
        
115
        super().__init__({
116
            'NomDenRazSocR': nom_den_raz_soc_r,
117
            'NumRegIdTrib': num_reg_id_trib,
118
        })
119
        
120
121
class Nacional(ScalarMap):
122
    """
123
    http://www.sat.gob.mx/esquemas/retencionpago/1
124
    Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana
125
    """
126
    def __init__(
127
            self,
128
            rfcrecep: str,
129
            nom_den_raz_soc_r: str = None,
130
            curpr: str = None,
131
    ): 
132
        """
133
        Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana
134
        
135
        :param rfcrecep: Atributo requerido para la clave del Registro Federal de Contribuyentes correspondiente al contribuyente receptor del documento.
136
        :param nom_den_raz_soc_r: Atributo opcional para el nombre, denominación o razón social del contribuyente receptor del documento.
137
        :param curpr: Atributo opcional para la Clave Única del Registro Poblacional del contribuyente receptor del documento.
138
        """
139
        
140
        super().__init__({
141
            'RFCRecep': rfcrecep,
142
            'NomDenRazSocR': nom_den_raz_soc_r,
143
            'CURPR': curpr,
144
        })
145
        
146
147
class Receptor(ScalarMap):
148
    """
149
    http://www.sat.gob.mx/esquemas/retencionpago/1
150
    Nodo requerido para expresar la información del contribuyente receptor del documento electrónico de retenciones e información de pagos.
151
    """
152
    def __init__(
153
            self,
154
            nacionalidad: str,
155
            nacional: Nacional | dict = None,
156
            extranjero: Extranjero | dict = None,
157
    ): 
158
        """
159
        Nodo requerido para expresar la información del contribuyente receptor del documento electrónico de retenciones e información de pagos.
160
        
161
        :param nacionalidad: Atributo requerido para expresar la nacionalidad del receptor del documento.
162
        :param nacional: Nodo requerido para expresar la información del contribuyente receptor en caso de que sea de nacionalidad mexicana
163
        :param extranjero: Nodo requerido para expresar la información del contribuyente receptor del documento cuando sea residente en el extranjero
164
        """
165
        
166
        super().__init__({
167
            'Nacionalidad': nacionalidad,
168
            'Nacional': nacional,
169
            'Extranjero': extranjero,
170
        })
171
172
173
class Emisor(ScalarMap):
174
    """
175
    Nodo requerido para expresar la información del contribuyente emisor del documento electrónico de retenciones e información de pagos.
176
177
    :param rfc_emisor: Atributo requerido para incorporar la clave en el Registro Federal de Contribuyentes correspondiente al contribuyente emisor del documento de retención e información de pagos, sin guiones o espacios.
178
    :param nom_den_raz_soc_e: Atributo opcional para el nombre, denominación o razón social del contribuyente emisor del documento de retención e información de pagos.
179
    :param curpe: Atributo opcional para la Clave Única del Registro Poblacional del contribuyente emisor del documento de retención e información de pagos.
180
    """
181
182
    def __init__(
183
            self,
184
            rfc_emisor: str,
185
            nom_den_raz_soc_e: str = None,
186
            curpe: str = None,
187
    ):
188
        super().__init__({
189
            'RFCEmisor': rfc_emisor,
190
            'NomDenRazSocE': nom_den_raz_soc_e,
191
            'CURPE': curpe,
192
        })
193
194
195 View Code Duplication
class Retenciones(CFDI):
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
196
    """
197
    Estándar de Documento Electrónico Retenciones e Información de Pagos.
198
    """
199
    tag = '{http://www.sat.gob.mx/esquemas/retencionpago/1}Retenciones'
200
    version = '1.0'
201
202
    def __init__(
203
            self,
204
            cve_retenc: str,
205
            emisor: Emisor | dict,
206
            receptor: Receptor | dict,
207
            periodo: Periodo | dict,
208
            totales: Totales | dict,
209
            folio_int: str = None,
210
            desc_retenc: str = None,
211
            complemento: XElement | Sequence[XElement] = None,
212
            addenda: XElement | Sequence[XElement] = None,
213
            fecha_exp: datetime = None,
214
    ):
215
        """
216
        Estándar de Documento Electrónico Retenciones e Información de Pagos.
217
218
        :param sello: Atributo requerido para contener el sello digital del documento de retención e información de pagos. El sello deberá ser expresado como una cadena de texto en formato base 64.
219
        :param num_cert: Atributo requerido para expresar el número de serie del certificado de sello digital con el que se selló digitalmente el documento de la retención e información de pagos.
220
        :param cert: Atributo requerido que sirve para incorporar el certificado de sello digital que ampara el documento de retención e información de pagos como texto, en formato base 64.
221
        :param fecha_exp: Atributo requerido para la expresión de la fecha y hora de expedición del documento de retención e información de pagos. Se expresa en la forma yyyy-mm-ddThh:mm:ssTZD-6, de acuerdo con la especificación ISO 8601.
222
        :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.
223
        :param emisor: Nodo requerido para expresar la información del contribuyente emisor del documento electrónico de retenciones e información de pagos.
224
        :param receptor: Nodo requerido para expresar la información del contribuyente receptor del documento electrónico de retenciones e información de pagos.
225
        :param periodo: Nodo requerido para expresar el periodo que ampara el documento de retenciones e información de pagos
226
        :param totales: Nodo requerido para expresar el total de las retenciones e información de pagos efectuados en el período que ampara el documento.
227
        :param folio_int: Atributo opcional para control interno del contribuyente que expresa el folio del documento que ampara la retención e información de pagos. Permite números y/o letras.
228
        :param desc_retenc: Atributo opcional que expresa la descripción de la retención e información de pagos en caso de que en el atributo CveRetenc se haya elegido el valor para 'otro tipo de retenciones'
229
        :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.
230
        :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.
231
        """
232
233
        fecha_exp = fecha_exp or datetime.now(tz=timezone(timedelta(hours=-6)))
234
        super().__init__({
235
            'Version': self.version,
236
            'Sello': '',
237
            'NumCert': '',
238
            'Cert':  '',
239
            'FechaExp': fecha_exp,
240
            'CveRetenc': cve_retenc,
241
            'FolioInt': folio_int,
242
            'DescRetenc': desc_retenc,
243
            'Emisor': emisor,
244
            'Receptor': receptor,
245
            'Periodo': periodo,
246
            'Totales': totales,
247
            'Complemento': complemento,
248
            'Addenda': addenda,
249
        })
250
251
    def sign(self, signer: Signer):
252
        self['NumCert'] = signer.certificate_number
253
        self['Cert'] = signer.certificate_base64()
254
        self['Sello'] = signer.sign_sha1(
255
            self.cadena_original().encode()
256
        )
257