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
Duplication
introduced
by
![]() |
|||
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 |