1
|
|
|
"""terceros http://www.sat.gob.mx/terceros""" |
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. |
16
|
|
|
:param aduana: Atributo opcional para precisar 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): |
|
|
|
|
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
|
|
View Code Duplication |
class Parte(ScalarMap): |
|
|
|
|
76
|
|
|
""" |
77
|
|
|
Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el CFD o CFDI |
78
|
|
|
|
79
|
|
|
:param cantidad: Atributo requerido para precisar la cantidad de bienes o servicios del tipo particular definido por la presente parte. |
80
|
|
|
:param descripcion: Atributo requerido para precisar la descripción del bien o servicio cubierto por la presente parte. |
81
|
|
|
:param unidad: Atributo opcional para precisar la unidad de medida aplicable para la cantidad expresada en la parte. |
82
|
|
|
:param no_identificacion: Atributo opcional para expresar el número de serie del bien o identificador del servicio amparado por la presente parte. |
83
|
|
|
:param valor_unitario: Atributo opcional para precisar el valor o precio unitario del bien o servicio cubierto por la presente parte. |
84
|
|
|
: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. |
85
|
|
|
:param informacion_aduanera: Nodo opcional para introducir la información aduanera aplicable cuando se trate de partes o componentes importados vendidos de primera mano. |
86
|
|
|
""" |
87
|
|
|
|
88
|
|
|
def __init__( |
89
|
|
|
self, |
90
|
|
|
cantidad: Decimal | int, |
91
|
|
|
descripcion: str, |
92
|
|
|
unidad: str = None, |
93
|
|
|
no_identificacion: str = None, |
94
|
|
|
valor_unitario: Decimal | int = None, |
95
|
|
|
importe: Decimal | int = None, |
96
|
|
|
informacion_aduanera: TInformacionAduanera | dict | Sequence[TInformacionAduanera | dict] = None, |
97
|
|
|
): |
98
|
|
|
super().__init__({ |
99
|
|
|
'Cantidad': cantidad, |
100
|
|
|
'Descripcion': descripcion, |
101
|
|
|
'Unidad': unidad, |
102
|
|
|
'NoIdentificacion': no_identificacion, |
103
|
|
|
'ValorUnitario': valor_unitario, |
104
|
|
|
'Importe': importe, |
105
|
|
|
'InformacionAduanera': informacion_aduanera, |
106
|
|
|
}) |
107
|
|
|
|
108
|
|
|
|
109
|
|
|
class InformacionAduanera(ScalarMap): |
110
|
|
|
""" |
111
|
|
|
Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas. |
112
|
|
|
|
113
|
|
|
""" |
114
|
|
|
|
115
|
|
|
def __init__( |
116
|
|
|
self, |
117
|
|
|
hello_there_super: TInformacionAduanera | dict |
118
|
|
|
): |
119
|
|
|
super().__init__({ |
120
|
|
|
}) |
121
|
|
|
|
122
|
|
|
|
123
|
|
|
class InformacionFiscalTercero(ScalarMap): |
124
|
|
|
""" |
125
|
|
|
Nodo opcional para expresar información fiscal de terceros |
126
|
|
|
|
127
|
|
|
""" |
128
|
|
|
|
129
|
|
|
def __init__( |
130
|
|
|
self, |
131
|
|
|
hello_there_super: TUbicacionFiscal | dict |
132
|
|
|
): |
133
|
|
|
super().__init__({ |
134
|
|
|
}) |
135
|
|
|
|
136
|
|
|
|
137
|
|
|
class Traslado(ScalarMap): |
138
|
|
|
""" |
139
|
|
|
Nodo para la información detallada de un traslado de impuesto específico |
140
|
|
|
|
141
|
|
|
:param impuesto: Atributo requerido para señalar el tipo de impuesto trasladado |
142
|
|
|
:param tasa: Atributo requerido para señalar la tasa del impuesto que se traslada por cada concepto amparado en el comprobante |
143
|
|
|
:param importe: Atributo requerido para señalar el importe del impuesto trasladado |
144
|
|
|
""" |
145
|
|
|
|
146
|
|
|
def __init__( |
147
|
|
|
self, |
148
|
|
|
impuesto: str, |
149
|
|
|
tasa: Decimal | int, |
150
|
|
|
importe: Decimal | int, |
151
|
|
|
): |
152
|
|
|
super().__init__({ |
153
|
|
|
'Impuesto': impuesto, |
154
|
|
|
'Tasa': tasa, |
155
|
|
|
'Importe': importe, |
156
|
|
|
}) |
157
|
|
|
|
158
|
|
|
|
159
|
|
|
class Retencion(ScalarMap): |
160
|
|
|
""" |
161
|
|
|
Nodo para la información detallada de una retención de impuesto específico |
162
|
|
|
|
163
|
|
|
:param impuesto: Atributo requerido para señalar el tipo de impuesto retenido |
164
|
|
|
:param importe: Atributo requerido para señalar el importe o monto del impuesto retenido |
165
|
|
|
""" |
166
|
|
|
|
167
|
|
|
def __init__( |
168
|
|
|
self, |
169
|
|
|
impuesto: str, |
170
|
|
|
importe: Decimal | int, |
171
|
|
|
): |
172
|
|
|
super().__init__({ |
173
|
|
|
'Impuesto': impuesto, |
174
|
|
|
'Importe': importe, |
175
|
|
|
}) |
176
|
|
|
|
177
|
|
|
|
178
|
|
|
class Impuestos(ScalarMap): |
179
|
|
|
""" |
180
|
|
|
Nodo requerido para capturar los impuestos aplicables. |
181
|
|
|
|
182
|
|
|
:param retenciones: Nodo opcional para capturar los impuestos retenidos aplicables |
183
|
|
|
:param traslados: Nodo opcional para asentar o referir los impuestos trasladados aplicables |
184
|
|
|
""" |
185
|
|
|
|
186
|
|
|
def __init__( |
187
|
|
|
self, |
188
|
|
|
retenciones: Retencion | dict | Sequence[Retencion | dict] = None, |
189
|
|
|
traslados: Traslado | dict | Sequence[Traslado | dict] = None, |
190
|
|
|
): |
191
|
|
|
super().__init__({ |
192
|
|
|
'Retenciones': retenciones, |
193
|
|
|
'Traslados': traslados, |
194
|
|
|
}) |
195
|
|
|
|
196
|
|
|
|
197
|
|
|
class PorCuentadeTerceros(CFDI): |
198
|
|
|
""" |
199
|
|
|
Complemento concepto para la emisión de Comprobante Fiscal Digital (CFD) y Comprobante Fiscal Digital a través de Internet (CFDI) por orden y cuenta de terceros. |
200
|
|
|
|
201
|
|
|
:param rfc: Atributo requerido para la Clave del Registro Federal de Contribuyentes correspondiente al contribuyente emisor del comprobante sin guiones o espacios. |
202
|
|
|
:param impuestos: Nodo requerido para capturar los impuestos aplicables. |
203
|
|
|
:param nombre: Atributo opcional para el nombre o razón social del contribuyente emisor del comprobante. |
204
|
|
|
:param informacion_fiscal_tercero: Nodo opcional para expresar información fiscal de terceros |
205
|
|
|
:param informacion_aduanera: Nodo opcional para introducir la información aduanera aplicable cuando se trate de ventas de primera mano de mercancías importadas. |
206
|
|
|
:param parte: Nodo opcional para expresar las partes o componentes que integran la totalidad del concepto expresado en el CFD o CFDI |
207
|
|
|
: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. |
208
|
|
|
""" |
209
|
|
|
|
210
|
|
|
tag = '{http://www.sat.gob.mx/terceros}PorCuentadeTerceros' |
211
|
|
|
version = '1.1' |
212
|
|
|
|
213
|
|
|
def __init__( |
214
|
|
|
self, |
215
|
|
|
rfc: str, |
216
|
|
|
impuestos: Impuestos | dict, |
217
|
|
|
nombre: str = None, |
218
|
|
|
informacion_fiscal_tercero: InformacionFiscalTercero | dict = None, |
219
|
|
|
informacion_aduanera: InformacionAduanera | dict = None, |
220
|
|
|
parte: Parte | dict | Sequence[Parte | dict] = None, |
221
|
|
|
cuenta_predial: str = None, |
222
|
|
|
): |
223
|
|
|
super().__init__({ |
224
|
|
|
'Version': self.version, |
225
|
|
|
'Rfc': rfc, |
226
|
|
|
'Impuestos': impuestos, |
227
|
|
|
'Nombre': nombre, |
228
|
|
|
'InformacionFiscalTercero': informacion_fiscal_tercero, |
229
|
|
|
'InformacionAduanera': informacion_aduanera, |
230
|
|
|
'Parte': parte, |
231
|
|
|
'CuentaPredial': cuenta_predial, |
232
|
|
|
}) |
233
|
|
|
|
234
|
|
|
|
235
|
|
|
|