-
-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
610 additions
and
43 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,249 @@ | ||
"""cce20 http://www.sat.gob.mx/ComercioExterior20""" | ||
from decimal import Decimal | ||
from datetime import datetime, date, time | ||
from collections.abc import Sequence | ||
from ...cfdi import CFDI | ||
from ...xelement import XElement | ||
from ...utils import ScalarMap | ||
|
||
|
||
class Domicilio(ScalarMap): | ||
""" | ||
Nodo requerido para expresar el domicilio del destinatario de la mercancía. | ||
:param calle: Atributo requerido que sirve para precisar la calle en que está ubicado el domicilio del destinatario de la mercancía. | ||
:param estado: Atributo requerido para señalar el estado, entidad, región, comunidad u otra figura análoga en donde se encuentra ubicado el domicilio del destinatario de la mercancía. El catálogo se publica en el Portal del SAT en internet y es conforme con la especificación ISO 3166-2. | ||
:param pais: Atributo requerido que sirve para precisar la clave del país donde se encuentra ubicado el destinatario de la mercancía, conforme con el catálogo c_Pais publicado en el Portal del SAT en internet que está basado en la especificación ISO 3166-1. | ||
:param codigo_postal: Atributo requerido que sirve para registrar el código postal en donde se encuentra ubicado el domicilio del destinatario de la mercancía. | ||
:param numero_exterior: Atributo opcional que sirve para expresar el número exterior en donde se ubica el domicilio del destinatario de la mercancía. | ||
:param numero_interior: Atributo opcional que sirve para expresar el número interior, en caso de existir, en donde se ubica el domicilio del destinatario de la mercancía. | ||
:param colonia: Atributo opcional que sirve para expresar la colonia o dato análogo en donde se ubica el domicilio del destinatario de la mercancía. | ||
:param localidad: Atributo opcional que sirve para precisar la ciudad, población, distrito u otro análogo en donde se ubica el domicilio del destinatario de la mercancía. | ||
:param referencia: Atributo opcional para registrar una referencia geográfica adicional que permita una fácil o precisa ubicación del domicilio del destinatario de la mercancía, por ejemplo las coordenadas GPS. | ||
:param municipio: Atributo opcional que sirve para precisar el municipio, delegación o alcaldía, condado o dato análogo en donde se encuentra ubicado el destinatario de la mercancía. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
calle: str, | ||
estado: str, | ||
pais: str, | ||
codigo_postal: str, | ||
numero_exterior: str = None, | ||
numero_interior: str = None, | ||
colonia: str = None, | ||
localidad: str = None, | ||
referencia: str = None, | ||
municipio: str = None, | ||
): | ||
super().__init__({ | ||
'Calle': calle, | ||
'Estado': estado, | ||
'Pais': pais, | ||
'CodigoPostal': codigo_postal, | ||
'NumeroExterior': numero_exterior, | ||
'NumeroInterior': numero_interior, | ||
'Colonia': colonia, | ||
'Localidad': localidad, | ||
'Referencia': referencia, | ||
'Municipio': municipio, | ||
}) | ||
|
||
|
||
class Destinatario(ScalarMap): | ||
""" | ||
Nodo opcional para capturar los datos del destinatario de la mercancía cuando éste sea distinto del receptor del CFDI. | ||
:param domicilio: Nodo requerido para expresar el domicilio del destinatario de la mercancía. | ||
:param num_reg_id_trib: Atributo opcional para incorporar el número de identificación o registro fiscal del país de residencia para efectos fiscales del destinatario de la mercancía exportada. | ||
:param nombre: Atributo opcional para expresar el nombre completo, denominación o razón social del destinatario de la mercancía exportada. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
domicilio: Domicilio | dict | Sequence[Domicilio | dict], | ||
num_reg_id_trib: str = None, | ||
nombre: str = None, | ||
): | ||
super().__init__({ | ||
'Domicilio': domicilio, | ||
'NumRegIdTrib': num_reg_id_trib, | ||
'Nombre': nombre, | ||
}) | ||
|
||
|
||
class Receptor(ScalarMap): | ||
""" | ||
Nodo condicional para capturar los datos complementarios del receptor del CFDI. | ||
:param num_reg_id_trib: Atributo condicional para incorporar el número de identificación o registro fiscal del país de residencia para efectos fiscales del receptor del CFDI. | ||
:param domicilio: Nodo requerido para expresar el domicilio del receptor del comprobante. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
num_reg_id_trib: str = None, | ||
domicilio: Domicilio | dict = None, | ||
): | ||
super().__init__({ | ||
'NumRegIdTrib': num_reg_id_trib, | ||
'Domicilio': domicilio, | ||
}) | ||
|
||
|
||
class Propietario(ScalarMap): | ||
""" | ||
Nodo condicional para capturar los datos del o los propietarios de la mercancía que se traslada y ésta no sea objeto de enajenación o siéndolo sea a título gratuito, cuando el emisor del CFDI es un tercero. | ||
:param num_reg_id_trib: Atributo requerido para incorporar el número de identificación o registro fiscal del país de residencia para efectos fiscales del propietario de la mercancía trasladada. | ||
:param residencia_fiscal: Atributo requerido para registrar la clave del país de residencia para efectos fiscales del propietario de la mercancía, conforme con el catálogo c_Pais publicado en el Portal del SAT en internet que está basado en la especificación ISO 3166-1. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
num_reg_id_trib: str, | ||
residencia_fiscal: str, | ||
): | ||
super().__init__({ | ||
'NumRegIdTrib': num_reg_id_trib, | ||
'ResidenciaFiscal': residencia_fiscal, | ||
}) | ||
|
||
|
||
class Emisor(ScalarMap): | ||
""" | ||
Nodo opcional para capturar los datos complementarios del emisor del comprobante. | ||
:param domicilio: Nodo requerido para expresar el domicilio del emisor del comprobante. | ||
:param curp: Atributo condicional para expresar la CURP del emisor del CFDI cuando es una persona física. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
domicilio: Domicilio | dict, | ||
curp: str = None, | ||
): | ||
super().__init__({ | ||
'Domicilio': domicilio, | ||
'Curp': curp, | ||
}) | ||
|
||
|
||
class DescripcionesEspecificas(ScalarMap): | ||
""" | ||
Nodo opcional que indica la lista de descripciones específicas de la mercancía. Una mercancía puede tener más de una descripción específica. | ||
:param marca: Atributo requerido que indica la marca de la mercancía. | ||
:param modelo: Atributo opcional que indica el modelo de la mercancía. | ||
:param sub_modelo: Atributo opcional que indica el submodelo de la mercancía. | ||
:param numero_serie: Atributo opcional que indica el número de serie de la mercancía. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
marca: str, | ||
modelo: str = None, | ||
sub_modelo: str = None, | ||
numero_serie: str = None, | ||
): | ||
super().__init__({ | ||
'Marca': marca, | ||
'Modelo': modelo, | ||
'SubModelo': sub_modelo, | ||
'NumeroSerie': numero_serie, | ||
}) | ||
|
||
|
||
class Mercancia(ScalarMap): | ||
""" | ||
Nodo requerido para capturar la información de la declaración de cada mercancía exportada. | ||
:param no_identificacion: Atributo requerido que sirve para expresar el número de parte, la clave de identificación que asigna la empresa o el número de serie de la mercancía exportada. | ||
:param valor_dolares: Atributo requerido que indica el valor total en dólares de Estados Unidos de América (USD). | ||
:param fraccion_arancelaria: Atributo condicional que sirve para expresar la clave de la fracción arancelaria correspondiente a la descripción de la mercancía exportada. Debe ser conforme al catálogo c_FraccionArancelaria publicado en el Portal del SAT en internet. | ||
:param cantidad_aduana: Atributo opcional para precisar la cantidad de bienes en la aduana conforme a la UnidadAduana cuando en el nodo Comprobante:Conceptos:Concepto se hubiera registrado información comercial. | ||
:param unidad_aduana: Atributo condicional para precisar la clave de la unidad de medida aplicable para la cantidad expresada en la mercancía en la aduana, conforme al catálogo c_UnidadAduana publicado en el Portal del SAT en internet. | ||
:param valor_unitario_aduana: Atributo condicional para precisar el valor o precio unitario del bien en la aduana. Se expresa en dólares de Estados Unidos de América (USD), el cual puede estar registrado hasta con 6 decimales. | ||
:param descripciones_especificas: Nodo opcional que indica la lista de descripciones específicas de la mercancía. Una mercancía puede tener más de una descripción específica. | ||
""" | ||
|
||
def __init__( | ||
self, | ||
no_identificacion: str, | ||
valor_dolares: Decimal | int, | ||
fraccion_arancelaria: str = None, | ||
cantidad_aduana: Decimal | int = None, | ||
unidad_aduana: str = None, | ||
valor_unitario_aduana: Decimal | int = None, | ||
descripciones_especificas: DescripcionesEspecificas | dict | Sequence[DescripcionesEspecificas | dict] = None, | ||
): | ||
super().__init__({ | ||
'NoIdentificacion': no_identificacion, | ||
'ValorDolares': valor_dolares, | ||
'FraccionArancelaria': fraccion_arancelaria, | ||
'CantidadAduana': cantidad_aduana, | ||
'UnidadAduana': unidad_aduana, | ||
'ValorUnitarioAduana': valor_unitario_aduana, | ||
'DescripcionesEspecificas': descripciones_especificas, | ||
}) | ||
|
||
|
||
class ComercioExterior(CFDI): | ||
""" | ||
Complemento para incorporar la información en caso de exportación definitiva de mercancías. | ||
:param clave_de_pedimento: Atributo requerido que indica la clave de pedimento que se haya declarado conforme al catálogo c_ClavePedimento publicado en el Portal del SAT en internet. | ||
:param certificado_origen: Atributo requerido para indicar la excepción de certificados de Origen de los Tratados de Libre Comercio que ha celebrado México con diversos países. 0 = No Funge como certificado de origen 1 = Funge como certificado de origen. | ||
:param tipo_cambio_usd: Atributo requerido que indica el número de pesos mexicanos que equivalen a un dólar de Estados Unidos de América, de acuerdo con el artículo 20 del Código Fiscal de la Federación. | ||
:param total_usd: Atributo requerido que indica el importe total del comprobante en dólares de Estados Unidos de América. | ||
:param mercancias: Nodo requerido para capturar la información de la declaración de las mercancías exportadas. | ||
:param motivo_traslado: Atributo condicional que indica la clave del motivo por el cual en la exportación definitiva de mercancías con clave de pedimento A1, éstas no son objeto de enajenación o siéndolo sean a título gratuito, desde el domicilio del emisor hacia el domicilio del receptor o del destinatario. La clave del motivo es conforme con el catálogo c_MotivoTraslado publicado en el Portal del SAT en internet. | ||
:param num_certificado_origen: Atributo condicional para expresar el folio del certificado de origen o el folio fiscal del CFDI con el que se pagó la expedición del certificado de origen. | ||
:param numero_exportador_confiable: Atributo condicional que indica el número de exportador confiable, conforme al artículo 22 del Anexo 1 del Tratado de Libre Comercio con la Asociación Europea y a la Decisión de la Comunidad Europea. | ||
:param incoterm: Atributo condicional que indica la clave del INCOTERM aplicable a la factura, conforme al catálogo c_INCOTERM publicado en el Portal del SAT en internet. | ||
:param observaciones: Atributo opcional para ingresar información adicional, como alguna leyenda que se considere incluir en el CFDI. | ||
:param emisor: Nodo opcional para capturar los datos complementarios del emisor del comprobante. | ||
:param propietario: Nodo condicional para capturar los datos del o los propietarios de la mercancía que se traslada y ésta no sea objeto de enajenación o siéndolo sea a título gratuito, cuando el emisor del CFDI es un tercero. | ||
:param receptor: Nodo condicional para capturar los datos complementarios del receptor del CFDI. | ||
:param destinatario: Nodo opcional para capturar los datos del destinatario de la mercancía cuando éste sea distinto del receptor del CFDI. | ||
""" | ||
|
||
tag = '{http://www.sat.gob.mx/ComercioExterior20}ComercioExterior' | ||
version = '2.0' | ||
|
||
def __init__( | ||
self, | ||
clave_de_pedimento: str, | ||
certificado_origen: int, | ||
tipo_cambio_usd: Decimal | int, | ||
total_usd: Decimal | int, | ||
mercancias: Mercancia | dict | Sequence[Mercancia | dict], | ||
motivo_traslado: str = None, | ||
num_certificado_origen: str = None, | ||
numero_exportador_confiable: str = None, | ||
incoterm: str = None, | ||
observaciones: str = None, | ||
emisor: Emisor | dict = None, | ||
propietario: Propietario | dict | Sequence[Propietario | dict] = None, | ||
receptor: Receptor | dict = None, | ||
destinatario: Destinatario | dict | Sequence[Destinatario | dict] = None, | ||
): | ||
super().__init__({ | ||
'Version': self.version, | ||
'ClaveDePedimento': clave_de_pedimento, | ||
'CertificadoOrigen': certificado_origen, | ||
'TipoCambioUSD': tipo_cambio_usd, | ||
'TotalUSD': total_usd, | ||
'Mercancias': mercancias, | ||
'MotivoTraslado': motivo_traslado, | ||
'NumCertificadoOrigen': num_certificado_origen, | ||
'NumeroExportadorConfiable': numero_exportador_confiable, | ||
'Incoterm': incoterm, | ||
'Observaciones': observaciones, | ||
'Emisor': emisor, | ||
'Propietario': propietario, | ||
'Receptor': receptor, | ||
'Destinatario': destinatario, | ||
}) | ||
|
||
|
Oops, something went wrong.