diff --git a/satcfdi/create/cfd/cartaporte31.py b/satcfdi/create/cfd/cartaporte31.py
new file mode 100644
index 0000000..a5170c0
--- /dev/null
+++ b/satcfdi/create/cfd/cartaporte31.py
@@ -0,0 +1,838 @@
+"""cartaporte31 http://www.sat.gob.mx/CartaPorte31"""
+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 opcional para registrar información del domicilio del(los) tipo(s) de figura transporte que intervenga(n) en el traslado de los bienes y/o mercancías.
+
+ :param estado: Atributo requerido para registrar el estado, entidad, región, comunidad, o dato análogo en donde se encuentra ubicado el domicilio del(los) tipo(s) de figura transporte.
+ :param pais: Atributo requerido que sirve para registrar la clave del país en donde se encuentra ubicado el domicilio del(los) tipo(s) de figura transporte, conforme al catálogo c_Pais del CFDI publicado en el portal del SAT en Internet de acuerdo a la especificación ISO 3166-1.
+ :param codigo_postal: Atributo requerido para registrar el código postal en donde se encuentra ubicado el domicilio del(los) tipo(s) de figura transporte.
+ :param calle: Atributo opcional que sirve para registrar la calle en la que está ubicado el domicilio del(los) tipo(s) de figura transporte.
+ :param numero_exterior: Atributo opcional que sirve para registrar el número exterior en donde se ubica el domicilio del(los) tipo(s) de figura transporte.
+ :param numero_interior: Atributo opcional que sirve para registrar el número interior, en caso de existir, en donde se ubica el domicilio del(los) tipo(s) de figura transporte.
+ :param colonia: Atributo opcional que sirve para expresar la clave de la colonia o dato análogo en donde se ubica el domicilio del(los) tipo(s) de figura transporte.
+ :param localidad: Atributo opcional para registrar la clave de la ciudad, población, distrito o dato análogo de donde se encuentra ubicado el domicilio del(los) tipo(s) de figura transporte.
+ :param referencia: Atributo opcional para registrar una referencia geográfica adicional que permita una fácil o precisa ubicación del domicilio del(los) tipo(s) de figura transporte; por ejemplo, las coordenadas del GPS.
+ :param municipio: Atributo opcional para registrar la clave del municipio, delegación o alcaldía, condado o dato análogo en donde se encuentra ubicado el domicilio del(los) tipo(s) de figura transporte.
+ """
+
+ def __init__(
+ self,
+ estado: str,
+ pais: str,
+ codigo_postal: str,
+ calle: str = None,
+ numero_exterior: str = None,
+ numero_interior: str = None,
+ colonia: str = None,
+ localidad: str = None,
+ referencia: str = None,
+ municipio: str = None,
+ ):
+ super().__init__({
+ 'Estado': estado,
+ 'Pais': pais,
+ 'CodigoPostal': codigo_postal,
+ 'Calle': calle,
+ 'NumeroExterior': numero_exterior,
+ 'NumeroInterior': numero_interior,
+ 'Colonia': colonia,
+ 'Localidad': localidad,
+ 'Referencia': referencia,
+ 'Municipio': municipio,
+ })
+
+
+class TiposFigura(ScalarMap):
+ """
+ Nodo condicional para indicar los datos del(los) tipo(s) de figura(s) que participan en el traslado de los bienes y/o mercancías en los distintos medios de transporte.
+
+ :param tipo_figura: Atributo requerido para registrar la clave de la figura de transporte que interviene en el traslado de los bienes y/o mercancías.
+ :param nombre_figura: Atributo requerido para registrar el nombre de la figura de transporte que interviene en el traslado de los bienes y/o mercancías.
+ :param rfc_figura: Atributo condicional para registrar el RFC de la figura de transporte que interviene en el traslado de los bienes y/o mercancías.
+ :param num_licencia: Atributo condicional para expresar el número de la licencia o el permiso otorgado al operador del autotransporte de carga en el que realiza el traslado de los bienes y/o mercancías.
+ :param num_reg_id_trib_figura: Atributo condicional para registrar el número de identificación o registro fiscal del país de residencia de la figura de transporte que interviene en el traslado de los bienes y/o mercancías, cuando se trate de residentes en el extranjero para los efectos fiscales correspondientes.
+ :param residencia_fiscal_figura: Atributo condicional para registrar la clave del país de residencia de la figura de transporte que interviene en el traslado de los bienes y/o mercancías para los efectos fiscales correspondientes.
+ :param partes_transporte: Nodo condicional para indicar los datos de las partes del transporte de las cuales el emisor del comprobante es distinto al dueño de las mismas, por ejemplo: vehículos, máquinas, contenedores, plataformas, entre otros, etc; mismos que son utilizados para el traslado de los bienes y/o mercancías.
+ :param domicilio: Nodo opcional para registrar información del domicilio del(los) tipo(s) de figura transporte que intervenga(n) en el traslado de los bienes y/o mercancías.
+ """
+
+ def __init__(
+ self,
+ tipo_figura: str,
+ nombre_figura: str,
+ rfc_figura: str = None,
+ num_licencia: str = None,
+ num_reg_id_trib_figura: str = None,
+ residencia_fiscal_figura: str = None,
+ partes_transporte: str | Sequence[str] = None,
+ domicilio: Domicilio | dict = None,
+ ):
+ super().__init__({
+ 'TipoFigura': tipo_figura,
+ 'NombreFigura': nombre_figura,
+ 'RFCFigura': rfc_figura,
+ 'NumLicencia': num_licencia,
+ 'NumRegIdTribFigura': num_reg_id_trib_figura,
+ 'ResidenciaFiscalFigura': residencia_fiscal_figura,
+ 'PartesTransporte': partes_transporte,
+ 'Domicilio': domicilio,
+ })
+
+
+class DerechosDePaso(ScalarMap):
+ """
+ Nodo opcional para registrar los tipos de derechos de paso cubiertos por el transportista en las vías férreas de las cuales no es concesionario o asignatario, así como la distancia establecida en kilómetros.
+
+ :param tipo_derecho_de_paso: Atributo requerido para registrar la clave del derecho de paso pagado por el transportista en las vías férreas de las cuales no es concesionario o asignatario.
+ :param kilometraje_pagado: Atributo requerido para registrar el total de kilómetros pagados por el transportista en las vías férreas de las cuales no es concesionario o asignatario con el derecho de paso.
+ """
+
+ def __init__(
+ self,
+ tipo_derecho_de_paso: str,
+ kilometraje_pagado: Decimal | int,
+ ):
+ super().__init__({
+ 'TipoDerechoDePaso': tipo_derecho_de_paso,
+ 'KilometrajePagado': kilometraje_pagado,
+ })
+
+
+class Contenedor(ScalarMap):
+ """
+ Nodo condicional para especificar el tipo de contenedor o vagón en el que se trasladan los bienes y/o mercancías por vía férrea.
+
+ :param tipo_contenedor: Atributo requerido para registrar la clave con la que se identifica al tipo de contenedor o el vagón en el que se realiza el traslado de los bienes y/o mercancías.
+ :param peso_contenedor_vacio: Atributo requerido para registrar en kilogramos, el peso del contenedor vacío en el que se trasladan los bienes y/o mercancías.
+ :param peso_neto_mercancia: Atributo requerido para registrar en kilogramos el peso neto de los bienes y/o mercancías que son trasladados en el contenedor.
+ """
+
+ def __init__(
+ self,
+ tipo_contenedor: str,
+ peso_contenedor_vacio: Decimal | int,
+ peso_neto_mercancia: Decimal | int,
+ ):
+ super().__init__({
+ 'TipoContenedor': tipo_contenedor,
+ 'PesoContenedorVacio': peso_contenedor_vacio,
+ 'PesoNetoMercancia': peso_neto_mercancia,
+ })
+
+
+class Carro(ScalarMap):
+ """
+ Nodo requerido para registrar la información que permite identificar el (los) carro(s) en el (los) que se trasladan los bienes y/o mercancías por vía férrea.
+
+ :param tipo_carro: Atributo requerido para registrar la clave del tipo de carro utilizado para el traslado de los bienes y/o mercancías por vía férrea.
+ :param matricula_carro: Atributo requerido para registrar el número de contenedor, carro de ferrocarril o número económico del vehículo en el que se trasladan los bienes y/o mercancías por vía férrea.
+ :param guia_carro: Atributo requerido para registrar el número de guía asignado al contenedor, carro de ferrocarril o vehículo, en el que se trasladan los bienes y/o mercancías por vía férrea.
+ :param toneladas_netas_carro: Atributo requerido para registrar la cantidad de las toneladas netas depositadas en el contenedor, carro de ferrocarril o vehículo en el que se trasladan los bienes y/o mercancías por vía férrea.
+ :param contenedor: Nodo condicional para especificar el tipo de contenedor o vagón en el que se trasladan los bienes y/o mercancías por vía férrea.
+ """
+
+ def __init__(
+ self,
+ tipo_carro: str,
+ matricula_carro: str,
+ guia_carro: str,
+ toneladas_netas_carro: Decimal | int,
+ contenedor: Contenedor | dict | Sequence[Contenedor | dict] = None,
+ ):
+ super().__init__({
+ 'TipoCarro': tipo_carro,
+ 'MatriculaCarro': matricula_carro,
+ 'GuiaCarro': guia_carro,
+ 'ToneladasNetasCarro': toneladas_netas_carro,
+ 'Contenedor': contenedor,
+ })
+
+
+class TransporteFerroviario(ScalarMap):
+ """
+ Nodo condicional para registrar la información que permita la identificación del carro o contenedor en el que se trasladan los bienes y/o mercancías por vía férrea.
+
+ :param tipo_de_servicio: Atributo requerido para registrar la clave del tipo de servicio utilizado para el traslado de los bienes y/o mercancías por vía férrea.
+ :param tipo_de_trafico: Atributo requerido para registrar la clave del tipo de tráfico (interrelación entre concesionarios) para realizar el traslado de los bienes y/o mercancías por vía férrea dentro del territorio nacional.
+ :param carro: Nodo requerido para registrar la información que permite identificar el (los) carro(s) en el (los) que se trasladan los bienes y/o mercancías por vía férrea.
+ :param nombre_aseg: Atributo opcional para registrar el nombre de la aseguradora que cubre los riesgos para el traslado de los bienes y/o mercancías por vía férrea.
+ :param num_poliza_seguro: Atributo opcional para registrar el número de póliza asignada por la aseguradora para la protección e indemnización por responsabilidad civil en el traslado de los bienes y/o mercancías que se realiza por vía férrea.
+ :param derechos_de_paso: Nodo opcional para registrar los tipos de derechos de paso cubiertos por el transportista en las vías férreas de las cuales no es concesionario o asignatario, así como la distancia establecida en kilómetros.
+ """
+
+ def __init__(
+ self,
+ tipo_de_servicio: str,
+ tipo_de_trafico: str,
+ carro: Carro | dict | Sequence[Carro | dict],
+ nombre_aseg: str = None,
+ num_poliza_seguro: str = None,
+ derechos_de_paso: DerechosDePaso | dict | Sequence[DerechosDePaso | dict] = None,
+ ):
+ super().__init__({
+ 'TipoDeServicio': tipo_de_servicio,
+ 'TipoDeTrafico': tipo_de_trafico,
+ 'Carro': carro,
+ 'NombreAseg': nombre_aseg,
+ 'NumPolizaSeguro': num_poliza_seguro,
+ 'DerechosDePaso': derechos_de_paso,
+ })
+
+
+class TransporteAereo(ScalarMap):
+ """
+ Nodo condicional para registrar la información que permita la identificación del transporte aéreo por medio del cual se trasladan los bienes y/o mercancías.
+
+ :param perm_sct: Atributo requerido para registrar la clave del permiso proporcionado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT), o la autoridad análoga, la cual debe corresponder con la aeronave que se está utilizando para realizar el traslado de los bienes y/o mercancías por vía aérea.
+ :param num_permiso_sct: Atributo requerido para registrar el número de permiso o valor análogo proporcionado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT), o la autoridad análoga, según corresponda, para el transporte de bienes y/o mercancías por vía aérea.
+ :param numero_guia: Atributo requerido para registrar el número de guía aérea con el que se trasladan los bienes y/o mercancías.
+ :param codigo_transportista: Atributo requerido para registrar el valor del código que tiene asignado el transportista el cual debe contener alguna de las claves contenidas en el catálogo correspondiente.
+ :param matricula_aeronave: Atributo opcional para registrar el número de la matrícula de la aeronave con la que se realiza el traslado de los bienes y/o mercancías en territorio nacional el cual tiene una longitud de 10 posiciones y se compone de valores alfanuméricos, más el carácter especial denominado guion medio “-“.
+ :param nombre_aseg: Atributo opcional para registrar el nombre de la aseguradora que cubre los riesgos de la aeronave con la que transportan los bienes y/o mercancías.
+ :param num_poliza_seguro: Atributo opcional para registrar el número de póliza asignado por la aseguradora que cubre la protección e indemnización por responsabilidad civil de la aeronave que transporta los bienes y/o mercancías.
+ :param lugar_contrato: Atributo opcional para registrar el lugar, entidad, región, localidad o análogo, donde se celebró el contrato para realizar el traslado de los bienes y/o mercancías.
+ :param rfc_embarcador: Atributo opcional para registrar el RFC del embarcador de los bienes y/o mercancías que se trasladan.
+ :param num_reg_id_trib_embarc: Atributo condicional para incorporar el número de identificación o registro fiscal del país de residencia cuando el embarcador sea residente en el extranjero para los efectos fiscales correspondientes de los bienes y/o mercancías que se trasladan.
+ :param residencia_fiscal_embarc: Atributo condicional para registrar la clave del país de residencia para efectos fiscales del embarcador de los bienes y/o mercancías.
+ :param nombre_embarcador: Atributo opcional para registrar el nombre del embarcador de los bienes y/o mercancías que se trasladan, ya sea nacional o extranjero.
+ """
+
+ def __init__(
+ self,
+ perm_sct: str,
+ num_permiso_sct: str,
+ numero_guia: str,
+ codigo_transportista: str,
+ matricula_aeronave: str = None,
+ nombre_aseg: str = None,
+ num_poliza_seguro: str = None,
+ lugar_contrato: str = None,
+ rfc_embarcador: str = None,
+ num_reg_id_trib_embarc: str = None,
+ residencia_fiscal_embarc: str = None,
+ nombre_embarcador: str = None,
+ ):
+ super().__init__({
+ 'PermSCT': perm_sct,
+ 'NumPermisoSCT': num_permiso_sct,
+ 'NumeroGuia': numero_guia,
+ 'CodigoTransportista': codigo_transportista,
+ 'MatriculaAeronave': matricula_aeronave,
+ 'NombreAseg': nombre_aseg,
+ 'NumPolizaSeguro': num_poliza_seguro,
+ 'LugarContrato': lugar_contrato,
+ 'RFCEmbarcador': rfc_embarcador,
+ 'NumRegIdTribEmbarc': num_reg_id_trib_embarc,
+ 'ResidenciaFiscalEmbarc': residencia_fiscal_embarc,
+ 'NombreEmbarcador': nombre_embarcador,
+ })
+
+
+class RemolqueCCP(ScalarMap):
+ """
+ Nodo requerido para expresar la información del(los) remolque(s) o semirremolque(s) que se adapta(n) al autotransporte que realizó el traslado de los bienes y/o mercancías registrado en el CFDI con complemento Carta Porte, únicamente aplica para traslado mediante ferri.
+
+ :param sub_tipo_rem_ccp: Atributo requerido para expresar la clave del subtipo de remolque o semirremolques que se emplean con el autotransporte que realizó el traslado de los bienes y/o mercancías registrado en el CFDI con complemento Carta Porte, únicamente aplica para traslado mediante ferri.
+ :param placa_ccp: Atributo requerido para registrar los caracteres alfanuméricos, sin guiones ni espacios de la placa del remolque o semirremolque registrado en el CFDI con complemento Carta Porte, únicamente aplica para traslado mediante ferri.
+ """
+
+ def __init__(
+ self,
+ sub_tipo_rem_ccp: str,
+ placa_ccp: str,
+ ):
+ super().__init__({
+ 'SubTipoRemCCP': sub_tipo_rem_ccp,
+ 'PlacaCCP': placa_ccp,
+ })
+
+
+class TransporteMaritimo(ScalarMap):
+ """
+ Nodo condicional para registrar la información que permita la identificación de la embarcación a través de la cual se trasladan los bienes y/o mercancías por vía marítima.
+
+ :param tipo_embarcacion: Atributo requerido para registrar la clave de identificación del tipo de embarcación que es utilizado para trasladar los bienes y/o mercancías.
+ :param matricula: Atributo requerido para registrar el número de la matrícula o registro de la embarcación que es utilizada para transportar los bienes y/o mercancías.
+ :param numero_omi: Atributo requerido para registrar el número de identificación asignado por la Organización Marítima Internacional, a la embarcación encargada de transportar los bienes y/o mercancías.
+ :param nacionalidad_embarc: Atributo requerido para registrar la clave del país correspondiente a la nacionalidad de la embarcación que transporta los bienes y/o mercancías.
+ :param unidades_de_arq_bruto: Atributo requerido para registrar el valor de las unidades de arqueo bruto conforme a las medidas internacionales definidas por el ITC para cada tipo de buque o embarcación en la que se transportan los bienes y/o mercancías.
+ :param tipo_carga: Atributo requerido para especificar el tipo de carga en el cual se clasifican los bienes y/o mercancías que se transportan en la embarcación.
+ :param nombre_agente_naviero: Atributo requerido para registrar el nombre del agente naviero consignatario autorizado para gestionar el traslado de los bienes y/o mercancías por vía marítima.
+ :param num_autorizacion_naviero: Atributo requerido para expresar el número de la autorización como agente naviero consignatario emitida por la autoridad correspondiente.
+ :param perm_sct: Atributo opcional para registrar la clave del permiso proporcionado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT), la cual debe corresponder con la embarcación que se está utilizando para el traslado de los bienes y/o mercancías, de acuerdo al catálogo correspondiente.
+ :param num_permiso_sct: Atributo opcional para registrar el número del permiso otorgado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT), a la embarcación utilizada para el traslado de los bienes y/o mercancías.
+ :param nombre_aseg: Atributo opcional para registrar el nombre de la aseguradora que cubre la protección e indemnización por responsabilidad civil de la embarcación en el traslado de los bienes y/o mercancías.
+ :param num_poliza_seguro: Atributo opcional para registrar el número de póliza asignada por la aseguradora que cubre la protección e indemnización por responsabilidad civil de la embarcación en el traslado de los bienes y/o mercancías.
+ :param anio_embarcacion: Atributo opcional para registrar el año de la embarcación en la que se transportan los bienes y/o mercancías.
+ :param nombre_embarc: Atributo opcional para registrar el nombre de la embarcación en la que se realiza el traslado de los bienes y/o mercancías.
+ :param eslora: Atributo opcional para registrar la longitud de eslora, definida en pies, con la que cuenta la embarcación o el buque en el que se transportan los bienes y/o mercancías.
+ :param manga: Atributo opcional para registrar la longitud de manga, definida en pies, con la que cuenta la embarcación o el buque en el que se transportan los bienes y/o mercancías.
+ :param calado: Atributo opcional para registrar la longitud del calado, definida en pies, con la que cuenta la embarcación o el buque en el que se transportan los bienes y/o mercancías.
+ :param puntal: Atributo opcional para registrar la longitud del puntal, definida en pies, con la que cuenta la embarcación o el buque en el que se transportan los bienes y/o mercancías.
+ :param linea_naviera: Atributo opcional para registrar el nombre de la línea naviera autorizada de gestionar el traslado de los bienes y/o mercancías por vía marítima.
+ :param num_viaje: Atributo opcional para registrar el número del viaje con el que se identifica el traslado de los bienes y/o mercancías en el buque o la embarcación.
+ :param num_conoc_embarc: Atributo opcional para registrar el número de conocimiento de embarque con el que se identifica el traslado de los bienes y/o mercancías.
+ :param permiso_temp_navegacion: Atributo condicional para registrar el permiso temporal de navegación de la embarcación o buque que transporta los bienes y/o mercancías.
+ :param contenedor: Nodo opcional para registrar los datos del contenedor en el que se transportan los bienes y/o mercancías.
+ """
+
+ def __init__(
+ self,
+ tipo_embarcacion: str,
+ matricula: str,
+ numero_omi: str,
+ nacionalidad_embarc: str,
+ unidades_de_arq_bruto: Decimal | int,
+ tipo_carga: str,
+ nombre_agente_naviero: str,
+ num_autorizacion_naviero: str,
+ perm_sct: str = None,
+ num_permiso_sct: str = None,
+ nombre_aseg: str = None,
+ num_poliza_seguro: str = None,
+ anio_embarcacion: int = None,
+ nombre_embarc: str = None,
+ eslora: Decimal | int = None,
+ manga: Decimal | int = None,
+ calado: Decimal | int = None,
+ puntal: Decimal | int = None,
+ linea_naviera: str = None,
+ num_viaje: str = None,
+ num_conoc_embarc: str = None,
+ permiso_temp_navegacion: str = None,
+ contenedor: Contenedor | dict | Sequence[Contenedor | dict] = None,
+ ):
+ super().__init__({
+ 'TipoEmbarcacion': tipo_embarcacion,
+ 'Matricula': matricula,
+ 'NumeroOMI': numero_omi,
+ 'NacionalidadEmbarc': nacionalidad_embarc,
+ 'UnidadesDeArqBruto': unidades_de_arq_bruto,
+ 'TipoCarga': tipo_carga,
+ 'NombreAgenteNaviero': nombre_agente_naviero,
+ 'NumAutorizacionNaviero': num_autorizacion_naviero,
+ 'PermSCT': perm_sct,
+ 'NumPermisoSCT': num_permiso_sct,
+ 'NombreAseg': nombre_aseg,
+ 'NumPolizaSeguro': num_poliza_seguro,
+ 'AnioEmbarcacion': anio_embarcacion,
+ 'NombreEmbarc': nombre_embarc,
+ 'Eslora': eslora,
+ 'Manga': manga,
+ 'Calado': calado,
+ 'Puntal': puntal,
+ 'LineaNaviera': linea_naviera,
+ 'NumViaje': num_viaje,
+ 'NumConocEmbarc': num_conoc_embarc,
+ 'PermisoTempNavegacion': permiso_temp_navegacion,
+ 'Contenedor': contenedor,
+ })
+
+
+class Remolque(ScalarMap):
+ """
+ Nodo requerido para expresar la información del(los) remolque(s) o semirremolque(s) que se adapta(n) al autotransporte para realizar el traslado de los bienes y/o mercancías.
+
+ :param sub_tipo_rem: Atributo requerido para expresar la clave del subtipo de remolque o semirremolques que se emplean con el autotransporte para el traslado de los bienes y/o mercancías.
+ :param placa: Atributo requerido para registrar los caracteres alfanuméricos, sin guiones ni espacios de la placa vehicular del remolque o semirremolque que es utilizado para transportar los bienes y/o mercancías.
+ """
+
+ def __init__(
+ self,
+ sub_tipo_rem: str,
+ placa: str,
+ ):
+ super().__init__({
+ 'SubTipoRem': sub_tipo_rem,
+ 'Placa': placa,
+ })
+
+
+class Seguros(ScalarMap):
+ """
+ Nodo requerido para registrar los datos de las pólizas de seguro que cubren los riesgos en el traslado de los bienes y/o mercancías.
+
+ :param asegura_resp_civil: Atributo requerido para registrar el nombre de la aseguradora que cubre los riesgos por responsabilidad civil del autotransporte utilizado para el traslado de los bienes y/o mercancías.
+ :param poliza_resp_civil: Atributo requerido para registrar el número de póliza asignado por la aseguradora, que cubre los riesgos por responsabilidad civil del autotransporte utilizado para el traslado de los bienes y/o mercancías.
+ :param asegura_med_ambiente: Atributo condicional para registrar el nombre de la aseguradora, que cubre los posibles daños al medio ambiente cuando exista al menos una mercancía tipificada como material peligroso se debe registrar la información del atributo “AseguraMedAmbiente” (aplicable para los transportistas de materiales, residuos o remanentes y desechos peligrosos.
+ :param poliza_med_ambiente: Atributo condicional para registrar el número de póliza asignado por la aseguradora, que cubre los posibles daños al medio ambiente cuando exista al menos una mercancía tipificada como material peligroso se debe registrar la información del atributo “AseguraMedAmbiente” (aplicable para los transportistas de materiales, residuos o remanentes y desechos peligrosos).
+ :param asegura_carga: Atributo opcional para registrar el nombre de la aseguradora que cubre los riesgos de la carga (bienes y/o mercancías) del autotransporte utilizado para el traslado.
+ :param poliza_carga: Atributo opcional para expresar el número de póliza asignado por la aseguradora que cubre los riesgos de la carga (bienes y/o mercancías) del autotransporte utilizado para el traslado.
+ :param prima_seguro: Atributo opcional para registrar el valor del importe por el cargo adicional convenido entre el transportista y el cliente, el cual será igual al valor de la prima del seguro contratado, conforme a lo establecido en la cláusula novena del Acuerdo por el que se homologa la Carta de Porte regulada por la Ley de Caminos, Puentes y Autotransporte Federal, con el complemento Carta Porte que debe acompañar al Comprobante Fiscal Digital por Internet (CFDI).
+ """
+
+ def __init__(
+ self,
+ asegura_resp_civil: str,
+ poliza_resp_civil: str,
+ asegura_med_ambiente: str = None,
+ poliza_med_ambiente: str = None,
+ asegura_carga: str = None,
+ poliza_carga: str = None,
+ prima_seguro: Decimal | int = None,
+ ):
+ super().__init__({
+ 'AseguraRespCivil': asegura_resp_civil,
+ 'PolizaRespCivil': poliza_resp_civil,
+ 'AseguraMedAmbiente': asegura_med_ambiente,
+ 'PolizaMedAmbiente': poliza_med_ambiente,
+ 'AseguraCarga': asegura_carga,
+ 'PolizaCarga': poliza_carga,
+ 'PrimaSeguro': prima_seguro,
+ })
+
+
+class IdentificacionVehicular(ScalarMap):
+ """
+ Nodo requerido para registrar los datos de identificación del autotransporte en el que se trasladan los bienes y/o mercancías.
+
+ :param config_vehicular: Atributo requerido para expresar la clave de nomenclatura del autotransporte que es utilizado para transportar los bienes y/o mercancías.
+ :param peso_bruto_vehicular: Atributo requerido para indicar en toneladas el peso bruto vehicular permitido del autotransporte de acuerdo a la NOM-SCT-012-2017 que es utilizado para realizar el traslado de los bienes y/o mercancías.
+ :param placa_vm: Atributo requerido para registrar solo los caracteres alfanuméricos, sin guiones ni espacios de la placa vehicular del autotransporte que es utilizado para transportar los bienes y/o mercancías.
+ :param anio_modelo_vm: Atributo requerido para registrar el año del autotransporte que es utilizado para transportar los bienes y/o mercancías.
+ """
+
+ def __init__(
+ self,
+ config_vehicular: str,
+ peso_bruto_vehicular: Decimal | int,
+ placa_vm: str,
+ anio_modelo_vm: int,
+ ):
+ super().__init__({
+ 'ConfigVehicular': config_vehicular,
+ 'PesoBrutoVehicular': peso_bruto_vehicular,
+ 'PlacaVM': placa_vm,
+ 'AnioModeloVM': anio_modelo_vm,
+ })
+
+
+class Autotransporte(ScalarMap):
+ """
+ Nodo condicional para registrar la información que permita la identificación del autotransporte de carga, por medio del cual se trasladan los bienes y/o mercancías, que transitan a través de las carreteras del territorio nacional.
+
+ :param perm_sct: Atributo requerido para registrar la clave del tipo de permiso proporcionado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT) o la autoridad análoga, el cual debe corresponder con el tipo de autotransporte utilizado para el traslado de los bienes y/o mercancías de acuerdo al catálogo correspondiente.
+ :param num_permiso_sct: Atributo requerido para registrar el número del permiso otorgado por la Secretaría de Infraestructura, Comunicaciones y Transportes (SICT) o la autoridad correspondiente, al autotransporte utilizado para el traslado de los bienes y/o mercancías.
+ :param identificacion_vehicular: Nodo requerido para registrar los datos de identificación del autotransporte en el que se trasladan los bienes y/o mercancías.
+ :param seguros: Nodo requerido para registrar los datos de las pólizas de seguro que cubren los riesgos en el traslado de los bienes y/o mercancías.
+ :param remolques: Nodo condicional para registrar los datos del(los) remolque(s) o semirremolque(s) que se adaptan al autotransporte para realizar el traslado de los bienes y/o mercancías.
+ """
+
+ def __init__(
+ self,
+ perm_sct: str,
+ num_permiso_sct: str,
+ identificacion_vehicular: IdentificacionVehicular | dict,
+ seguros: Seguros | dict,
+ remolques: Remolque | dict | Sequence[Remolque | dict] = None,
+ ):
+ super().__init__({
+ 'PermSCT': perm_sct,
+ 'NumPermisoSCT': num_permiso_sct,
+ 'IdentificacionVehicular': identificacion_vehicular,
+ 'Seguros': seguros,
+ 'Remolques': remolques,
+ })
+
+
+class DetalleMercancia(ScalarMap):
+ """
+ Nodo condicional para registrar especificaciones de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+
+ :param unidad_peso_merc: Atributo requerido para registrar la clave de la unidad de medida estandarizada del peso de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param peso_bruto: Atributo requerido para registrar el peso bruto total de los bienes y/o mercancías que se trasladan a través de los diferentes medios de transporte.
+ :param peso_neto: Atributo requerido para registrar el peso neto total de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param peso_tara: Atributo requerido para registrar el peso bruto, menos el peso neto de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param num_piezas: Atributo opcional para registrar el número de piezas de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ """
+
+ def __init__(
+ self,
+ unidad_peso_merc: str,
+ peso_bruto: Decimal | int,
+ peso_neto: Decimal | int,
+ peso_tara: Decimal | int,
+ num_piezas: int = None,
+ ):
+ super().__init__({
+ 'UnidadPesoMerc': unidad_peso_merc,
+ 'PesoBruto': peso_bruto,
+ 'PesoNeto': peso_neto,
+ 'PesoTara': peso_tara,
+ 'NumPiezas': num_piezas,
+ })
+
+
+class CantidadTransporta(ScalarMap):
+ """
+ Nodo opcional para registrar la cantidad de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte, que será captada o distribuida en distintos puntos, a fin de identificar el punto de origen y destino correspondiente.
+
+ :param cantidad: Atributo requerido para expresar el número de bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param id_origen: Atributo requerido para expresar la clave del identificador del origen de los bienes y/o mercancías que se trasladan por los distintos medios de transporte, de acuerdo al valor registrado en el atributo “IDUbicacion”, del nodo “Ubicacion”.
+ :param id_destino: Atributo requerido para registrar la clave del identificador del destino de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte, de acuerdo al valor registrado en el atributo “IDUbicacion”, del nodo “Ubicacion”.
+ :param cves_transporte: Atributo condicional para indicar la clave a través de la cual se identifica el medio por el que se transportan los bienes y/o mercancías.
+ """
+
+ def __init__(
+ self,
+ cantidad: Decimal | int,
+ id_origen: str,
+ id_destino: str,
+ cves_transporte: str = None,
+ ):
+ super().__init__({
+ 'Cantidad': cantidad,
+ 'IDOrigen': id_origen,
+ 'IDDestino': id_destino,
+ 'CvesTransporte': cves_transporte,
+ })
+
+
+class GuiasIdentificacion(ScalarMap):
+ """
+ Nodo condicional para registrar la información del(los) número(s) de guía(s) que se encuentre(n) asociado(s) al(los) paquete(s) que se traslada(n) dentro del territorio nacional.
+
+ :param numero_guia_identificacion: Atributo requerido para expresar el número de guía de cada paquete que se encuentra asociado con el traslado de los bienes y/o mercancías en territorio nacional.
+ :param descrip_guia_identificacion: Atributo requerido para expresar la descripción del contenido del paquete o carga registrada en la guía, o en el número de identificación, que se encuentra asociado con el traslado de los bienes y/o mercancías dentro del territorio nacional.
+ :param peso_guia_identificacion: Atributo requerido para indicar en kilogramos, el peso del paquete o carga que se está trasladando en territorio nacional y que se encuentra registrado en la guía o el número de identificación correspondiente.
+ """
+
+ def __init__(
+ self,
+ numero_guia_identificacion: str,
+ descrip_guia_identificacion: str,
+ peso_guia_identificacion: Decimal | int,
+ ):
+ super().__init__({
+ 'NumeroGuiaIdentificacion': numero_guia_identificacion,
+ 'DescripGuiaIdentificacion': descrip_guia_identificacion,
+ 'PesoGuiaIdentificacion': peso_guia_identificacion,
+ })
+
+
+class DocumentacionAduanera(ScalarMap):
+ """
+ Nodo condicional para registrar la información del(los) documento(s) aduanero(s) que se encuentra(n) asociado(s) al traslado de los bienes y/o mercancías por los distintos medios de transporte de procedencia extranjera para acreditar la legal estancia o tenencia durante su traslado en territorio nacional.
+
+ :param tipo_documento: Atributo requerido para expresar el tipo de documento aduanero que se encuentra asociado al traslado de los bienes y/o mercancías de procedencia extranjera durante su traslado en territorio nacional.
+ :param num_pedimento: Atributo condicional para expresar el número de pedimento de importación que se encuentra asociado con el traslado de los bienes y/o mercancías de procedencia extranjera para acreditar la legal estancia y tenencia durante su traslado en territorio nacional, el cual se expresa en el siguiente formato: últimos 2 dígitos del año de validación seguidos por dos espacios, 2 dígitos de la aduana de despacho seguidos por dos espacios, 4 dígitos del número de la patente seguidos por dos espacios, 1 dígito que corresponde al último dígito del año en curso, salvo que se trate de un pedimento consolidado iniciado en el año inmediato anterior o del pedimento original de una rectificación, seguido de 6 dígitos de la numeración progresiva por aduana.
+ :param ident_doc_aduanero: Atributo condicional para expresar el identificador o folio del documento aduanero que se encuentra asociado al traslado de los bienes y/o mercancías de procedencia extranjera para acreditar la legal estancia o tenencia durante su traslado en territorio nacional.
+ :param rfc_impo: Atributo condicional para expresar el RFC del importador de los bienes y/o mercancías que fue registrado en la documentación aduanera correspondiente y este se encuentre en la lista de RFC inscritos no cancelados del SAT (l_RFC).
+ """
+
+ def __init__(
+ self,
+ tipo_documento: str,
+ num_pedimento: str = None,
+ ident_doc_aduanero: str = None,
+ rfc_impo: str = None,
+ ):
+ super().__init__({
+ 'TipoDocumento': tipo_documento,
+ 'NumPedimento': num_pedimento,
+ 'IdentDocAduanero': ident_doc_aduanero,
+ 'RFCImpo': rfc_impo,
+ })
+
+
+class Mercancia(ScalarMap):
+ """
+ Nodo requerido para registrar detalladamente la información de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+
+ :param bienes_transp: Atributo requerido para registrar la clave de producto de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param descripcion: Atributo requerido para detallar las características de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param cantidad: Atributo requerido para expresar la cantidad total de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param clave_unidad: Atributo requerido para registrar la clave de la unidad de medida estandarizada aplicable para la cantidad de los bienes y/o mercancías que se trasladan en los distintos medios de transporte. La unidad debe corresponder con la descripción de los bienes y/o mercancías registrados.
+ :param peso_en_kg: Atributo requerido para indicar en kilogramos el peso estimado de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param clave_stcc: Atributo opcional para expresar la clave de producto de la STCC (por sus siglas en inglés, Standard Transportation Commodity Code), cuando el medio de transporte utilizado para el traslado de los bienes y/o mercancías sea ferroviario.
+ :param unidad: Atributo opcional para registrar la unidad de medida propia para la cantidad de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte. La unidad debe corresponder con la descripción de los bienes y/o mercancías.
+ :param dimensiones: Atributo opcional para expresar las medidas del empaque de los bienes y/o mercancías que se trasladan en los distintos medios de transporte. Se debe registrar la longitud, la altura y la anchura en centímetros o en pulgadas, separados dichos valores con una diagonal, i.e. 30/40/30cm.
+ :param material_peligroso: Atributo condicional para precisar que los bienes y/o mercancías que se trasladan son considerados o clasificados como material peligroso.
+ :param cve_material_peligroso: Atributo condicional para indicar la clave del tipo de material peligroso que se transporta de acuerdo a la NOM-002-SCT/2011.
+ :param embalaje: Atributo condicional para precisar la clave del tipo de embalaje que se requiere para transportar el material o residuo peligroso.
+ :param descrip_embalaje: Atributo opcional para expresar la descripción del embalaje de los bienes y/o mercancías que se trasladan y que se consideran material o residuo peligroso.
+ :param sector_cofepris: Atributo opcional para expresar la clasificación del producto que se traslada a través de los distintos medios de transporte y que debe contar con autorización por la autoridad correspondiente.
+ :param nombre_ingrediente_activo: Atributo condicional para expresar el nombre común del ingrediente activo de los precursores, químicos de uso dual, plaguicidas o fertilizantes que se trasladan a través de los distintos medios de transporte.
+ :param nom_quimico: Atributo condicional para expresar el nombre de la sustancia activa de los precursores, químicos de uso dual o sustancias tóxicas que se traslada a través de los distintos medios de transporte.
+ :param denominacion_generica_prod: Atributo condicional para expresar el fármaco o la sustancia activa del medicamento, psicotrópico o estupefaciente que se traslada a través de los distintos medios de transporte.
+ :param denominacion_distintiva_prod: Atributo condicional para expresar la marca con la que se comercializa el producto o nombre que le asigna el laboratorio o fabricante a sus especialidades farmacéuticas con el fin de distinguirlas de otras similares del medicamento, psicotrópico o estupefaciente que se traslada a través de los distintos medios de transporte.
+ :param fabricante: Atributo condicional para expresar el nombre o razón social del establecimiento que realiza la fabricación o manufactura del medicamento, precursor, químico de uso dual, psicotrópico o estupefaciente que se traslada a través de los distintos medios de transporte.
+ :param fecha_caducidad: Atributo condicional para registrar la fecha de caducidad del medicamento, psicotrópico o estupefaciente; o para expresar la fecha de reanálisis del precursor o químico de uso dual que se traslada a través de los distintos medios de transporte. Se expresa en la forma AAAA-MM-DD.
+ :param lote_medicamento: Atributo condicional para expresar la denominación que identifica y confiere trazabilidad del medicamento, precursor, químico de uso dual, psicotrópico o estupefaciente elaborado en un ciclo de producción, bajo condiciones equivalentes de operación y durante un periodo.
+ :param forma_farmaceutica: Atributo condicional para expresar la forma farmacéutica o mezcla del medicamento, precursor, químico de uso dual, psicotrópico o estupefaciente que presenta ciertas características físicas para su adecuada dosificación, conservación y administración.
+ :param condiciones_esp_transp: Atributo condicional para expresar la condición en la cual es necesario mantener el medicamento, precursor, químico de uso dual, psicotrópicos o estupefacientes durante el traslado y almacenamiento.
+ :param registro_sanitario_folio_autorizacion: Atributo condicional para expresar el registro sanitario o folio de autorización con el que cuenta la empresa para el traslado del medicamento, psicotrópico o estupefaciente.
+ :param permiso_importacion: Atributo condicional para registrar el folio del permiso de importación con el que cuenta el medicamento, precursor, químico de uso dual, psicotrópico o estupefaciente.
+ :param folio_impo_vucem: Atributo condicional para registrar el número de folio de importación VUCEM para la identificación del documento, para el traslado de medicamentos, precursores o químicos de uso dual, sustancias tóxicas, plaguicidas o fertilizantes.
+ :param num_cas: Atributo condicional para expresar el número Chemical Abstracts Service (CAS) con el que se identifica el compuesto químico de la sustancia tóxica.
+ :param razon_social_emp_imp: Atributo condicional para expresar el nombre o razón social de la empresa importadora de las sustancias tóxicas.
+ :param num_reg_san_plag_cofepris: Atributo condicional para expresar el número de registro sanitario para plaguicidas o fertilizantes cuya importación, comercialización y uso están permitidos en México, mismo que emite la Comisión Intersecretarial para el Control del Proceso y Uso de Plaguicidas, Fertilizantes y Sustancias Tóxicas (CICLOPLAFEST).
+ :param datos_fabricante: Atributo condicional para registrar el país y nombre o razón social de quien produce o fabrica el ingrediente activo del plaguicida o fertilizante.
+ :param datos_formulador: Atributo condicional para registrar el país y nombre o razón social de quien formula el ingrediente activo del plaguicida o fertilizante.
+ :param datos_maquilador: Atributo condicional para registrar el país y nombre o razón social de quien maquila el ingrediente activo del plaguicida o fertilizante.
+ :param uso_autorizado: Atributo condicional para registrar el uso autorizado del plaguicida o fertilizante de acuerdo a la regulación del país.
+ :param valor_mercancia: Atributo condicional para expresar el monto del valor de los bienes y/o mercancías que se trasladan en los distintos medios de transporte, de acuerdo al valor mercado, al valor pactado en la contraprestación o bien al valor estimado que determine el contribuyente.
+ :param moneda: Atributo condicional para identificar la clave de la moneda utilizada para expresar el valor de los bienes y/o mercancías que se trasladan en los distintos medios de transporte. Cuando se usa moneda nacional se registra MXN, de acuerdo a la especificación ISO 4217.
+ :param fraccion_arancelaria: Atributo opcional que sirve para expresar la clave de la fracción arancelaria que corresponde con la descripción de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param uuid_comercio_ext: Atributo opcional para expresar el folio fiscal (UUID) del comprobante de comercio exterior que se relaciona.
+ :param tipo_materia: Atributo condicional para expresar el estado de la materia o producto al realizar una operación de comercio exterior a través de los distintos medios de transporte.
+ :param descripcion_materia: Atributo condicional para expresar la descripción del estado de la materia o producto al realizar una operación de comercio exterior a través de los distintos medios de transporte.
+ :param documentacion_aduanera: Nodo condicional para registrar la información del(los) documento(s) aduanero(s) que se encuentra(n) asociado(s) al traslado de los bienes y/o mercancías por los distintos medios de transporte de procedencia extranjera para acreditar la legal estancia o tenencia durante su traslado en territorio nacional.
+ :param guias_identificacion: Nodo condicional para registrar la información del(los) número(s) de guía(s) que se encuentre(n) asociado(s) al(los) paquete(s) que se traslada(n) dentro del territorio nacional.
+ :param cantidad_transporta: Nodo opcional para registrar la cantidad de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte, que será captada o distribuida en distintos puntos, a fin de identificar el punto de origen y destino correspondiente.
+ :param detalle_mercancia: Nodo condicional para registrar especificaciones de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ """
+
+ def __init__(
+ self,
+ bienes_transp: str,
+ descripcion: str,
+ cantidad: Decimal | int,
+ clave_unidad: str,
+ peso_en_kg: Decimal | int,
+ clave_stcc: str = None,
+ unidad: str = None,
+ dimensiones: str = None,
+ material_peligroso: str = None,
+ cve_material_peligroso: str = None,
+ embalaje: str = None,
+ descrip_embalaje: str = None,
+ sector_cofepris: str = None,
+ nombre_ingrediente_activo: str = None,
+ nom_quimico: str = None,
+ denominacion_generica_prod: str = None,
+ denominacion_distintiva_prod: str = None,
+ fabricante: str = None,
+ fecha_caducidad: date = None,
+ lote_medicamento: str = None,
+ forma_farmaceutica: str = None,
+ condiciones_esp_transp: str = None,
+ registro_sanitario_folio_autorizacion: str = None,
+ permiso_importacion: str = None,
+ folio_impo_vucem: str = None,
+ num_cas: str = None,
+ razon_social_emp_imp: str = None,
+ num_reg_san_plag_cofepris: str = None,
+ datos_fabricante: str = None,
+ datos_formulador: str = None,
+ datos_maquilador: str = None,
+ uso_autorizado: str = None,
+ valor_mercancia: Decimal | int = None,
+ moneda: str = None,
+ fraccion_arancelaria: str = None,
+ uuid_comercio_ext: str = None,
+ tipo_materia: str = None,
+ descripcion_materia: str = None,
+ documentacion_aduanera: DocumentacionAduanera | dict | Sequence[DocumentacionAduanera | dict] = None,
+ guias_identificacion: GuiasIdentificacion | dict | Sequence[GuiasIdentificacion | dict] = None,
+ cantidad_transporta: CantidadTransporta | dict | Sequence[CantidadTransporta | dict] = None,
+ detalle_mercancia: DetalleMercancia | dict = None,
+ ):
+ super().__init__({
+ 'BienesTransp': bienes_transp,
+ 'Descripcion': descripcion,
+ 'Cantidad': cantidad,
+ 'ClaveUnidad': clave_unidad,
+ 'PesoEnKg': peso_en_kg,
+ 'ClaveSTCC': clave_stcc,
+ 'Unidad': unidad,
+ 'Dimensiones': dimensiones,
+ 'MaterialPeligroso': material_peligroso,
+ 'CveMaterialPeligroso': cve_material_peligroso,
+ 'Embalaje': embalaje,
+ 'DescripEmbalaje': descrip_embalaje,
+ 'SectorCOFEPRIS': sector_cofepris,
+ 'NombreIngredienteActivo': nombre_ingrediente_activo,
+ 'NomQuimico': nom_quimico,
+ 'DenominacionGenericaProd': denominacion_generica_prod,
+ 'DenominacionDistintivaProd': denominacion_distintiva_prod,
+ 'Fabricante': fabricante,
+ 'FechaCaducidad': fecha_caducidad,
+ 'LoteMedicamento': lote_medicamento,
+ 'FormaFarmaceutica': forma_farmaceutica,
+ 'CondicionesEspTransp': condiciones_esp_transp,
+ 'RegistroSanitarioFolioAutorizacion': registro_sanitario_folio_autorizacion,
+ 'PermisoImportacion': permiso_importacion,
+ 'FolioImpoVUCEM': folio_impo_vucem,
+ 'NumCAS': num_cas,
+ 'RazonSocialEmpImp': razon_social_emp_imp,
+ 'NumRegSanPlagCOFEPRIS': num_reg_san_plag_cofepris,
+ 'DatosFabricante': datos_fabricante,
+ 'DatosFormulador': datos_formulador,
+ 'DatosMaquilador': datos_maquilador,
+ 'UsoAutorizado': uso_autorizado,
+ 'ValorMercancia': valor_mercancia,
+ 'Moneda': moneda,
+ 'FraccionArancelaria': fraccion_arancelaria,
+ 'UUIDComercioExt': uuid_comercio_ext,
+ 'TipoMateria': tipo_materia,
+ 'DescripcionMateria': descripcion_materia,
+ 'DocumentacionAduanera': documentacion_aduanera,
+ 'GuiasIdentificacion': guias_identificacion,
+ 'CantidadTransporta': cantidad_transporta,
+ 'DetalleMercancia': detalle_mercancia,
+ })
+
+
+class Mercancias(ScalarMap):
+ """
+ Nodo requerido para registrar la información de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+
+ :param peso_bruto_total: Atributo requerido para registrar la suma del peso bruto total estimado de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param unidad_peso: Atributo requerido para registrar la clave de la unidad de medida estandarizada del peso de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param num_total_mercancias: Atributo requerido para registrar el número total de los bienes y/o mercancías que se trasladan en los distintos medios de transporte, identificándose por cada nodo "Mercancia" registrado en el complemento.
+ :param mercancia: Nodo requerido para registrar detalladamente la información de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param peso_neto_total: Atributo condicional para registrar la suma de los valores indicados en el atributo “PesoNeto” del nodo “DetalleMercancia”.
+ :param cargo_por_tasacion: Atributo opcional para expresar el monto del importe pagado por la tasación de los bienes y/o mercancías que se trasladan vía aérea.
+ :param logistica_inversa_recoleccion_devolucion: Atributo condicional para expresar si se hace uso de alguno de los servicios de logística inversa, recolección o devolución para el traslado de los bienes y/o mercancías.
+ :param autotransporte: Nodo condicional para registrar la información que permita la identificación del autotransporte de carga, por medio del cual se trasladan los bienes y/o mercancías, que transitan a través de las carreteras del territorio nacional.
+ :param transporte_maritimo: Nodo condicional para registrar la información que permita la identificación de la embarcación a través de la cual se trasladan los bienes y/o mercancías por vía marítima.
+ :param transporte_aereo: Nodo condicional para registrar la información que permita la identificación del transporte aéreo por medio del cual se trasladan los bienes y/o mercancías.
+ :param transporte_ferroviario: Nodo condicional para registrar la información que permita la identificación del carro o contenedor en el que se trasladan los bienes y/o mercancías por vía férrea.
+ """
+
+ def __init__(
+ self,
+ peso_bruto_total: Decimal | int,
+ unidad_peso: str,
+ num_total_mercancias: int,
+ mercancia: Mercancia | dict | Sequence[Mercancia | dict],
+ peso_neto_total: Decimal | int = None,
+ cargo_por_tasacion: Decimal | int = None,
+ logistica_inversa_recoleccion_devolucion: str = None,
+ autotransporte: Autotransporte | dict = None,
+ transporte_maritimo: TransporteMaritimo | dict = None,
+ transporte_aereo: TransporteAereo | dict = None,
+ transporte_ferroviario: TransporteFerroviario | dict = None,
+ ):
+ super().__init__({
+ 'PesoBrutoTotal': peso_bruto_total,
+ 'UnidadPeso': unidad_peso,
+ 'NumTotalMercancias': num_total_mercancias,
+ 'Mercancia': mercancia,
+ 'PesoNetoTotal': peso_neto_total,
+ 'CargoPorTasacion': cargo_por_tasacion,
+ 'LogisticaInversaRecoleccionDevolucion': logistica_inversa_recoleccion_devolucion,
+ 'Autotransporte': autotransporte,
+ 'TransporteMaritimo': transporte_maritimo,
+ 'TransporteAereo': transporte_aereo,
+ 'TransporteFerroviario': transporte_ferroviario,
+ })
+
+
+class Ubicacion(ScalarMap):
+ """
+ Nodo requerido para registrar la ubicación que sirve para indicar el domicilio del origen y/o destino parcial o final, que tienen los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+
+ :param tipo_ubicacion: Atributo requerido para precisar si el tipo de ubicación corresponde al origen o destino de las ubicaciones para el traslado de los bienes y/o mercancías en los distintos medios de transporte.
+ :param rfc_remitente_destinatario: Atributo requerido para registrar el RFC del remitente o destinatario de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param fecha_hora_salida_llegada: Atributo requerido para registrar la fecha y hora estimada en la que salen o llegan los bienes y/o mercancías de origen o al destino, respectivamente. Se expresa en la forma AAAA-MM-DDThh:mm:ss.
+ :param id_ubicacion: Atributo condicional para registrar una clave que sirva para identificar el punto de salida o entrada de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte, la cual estará integrada de la siguiente forma: para origen el acrónimo “OR” o para destino el acrónimo “DE” seguido de 6 dígitos numéricos asignados por el contribuyente que emite el comprobante para su identificación.
+ :param nombre_remitente_destinatario: Atributo opcional para registrar el nombre del remitente o destinatario de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param num_reg_id_trib: Atributo condicional para registrar el número de identificación o registro fiscal del país de residencia, para los efectos fiscales del remitente o destinatario de los bienes y/o mercancías que se trasladan cuando se trate de residentes en el extranjero.
+ :param residencia_fiscal: Atributo condicional para registrar la clave del país de residencia para efectos fiscales del remitente o destinatario de los bienes y/o mercancías, conforme el catálogo de CFDI c_Pais publicado en el portal del SAT en Internet de acuerdo a la especificación ISO 3166-1.
+ :param num_estacion: Atributo condicional para registrar la clave de la estación de origen o destino para el traslado de los bienes y/o mercancías que se realiza a través de los distintos medios de transporte, esto de acuerdo al valor de la columna “Clave identificación” del catálogo c_Estaciones del complemento Carta Porte que permita asociarla al tipo de transporte.
+ :param nombre_estacion: Atributo condicional para registrar el nombre de la estación de origen o destino por la que se pasa para efectuar el traslado de los bienes y/o mercancías a través de los distintos medios de transporte, conforme al catálogo c_Estaciones del complemento Carta Porte.
+ :param navegacion_trafico: Atributo condicional para registrar el tipo de puerto de origen o destino en el cual se documentan los bienes y/o mercancías que se trasladan vía marítima.
+ :param tipo_estacion: Atributo condicional para registrar el tipo de estación por el que pasan los bienes y/o mercancías durante su traslado a través de los distintos medios de transporte.
+ :param distancia_recorrida: Atributo condicional para registrar en kilómetros la distancia recorrida entre la ubicación de origen y la de destino parcial o final, por los distintos medios de transporte que trasladan los bienes y/o mercancías.
+ :param domicilio: Nodo condicional para registrar información del domicilio de origen y/o destino de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ """
+
+ def __init__(
+ self,
+ tipo_ubicacion: str,
+ rfc_remitente_destinatario: str,
+ fecha_hora_salida_llegada: datetime,
+ id_ubicacion: str = None,
+ nombre_remitente_destinatario: str = None,
+ num_reg_id_trib: str = None,
+ residencia_fiscal: str = None,
+ num_estacion: str = None,
+ nombre_estacion: str = None,
+ navegacion_trafico: str = None,
+ tipo_estacion: str = None,
+ distancia_recorrida: Decimal | int = None,
+ domicilio: Domicilio | dict = None,
+ ):
+ super().__init__({
+ 'TipoUbicacion': tipo_ubicacion,
+ 'RFCRemitenteDestinatario': rfc_remitente_destinatario,
+ 'FechaHoraSalidaLlegada': fecha_hora_salida_llegada,
+ 'IDUbicacion': id_ubicacion,
+ 'NombreRemitenteDestinatario': nombre_remitente_destinatario,
+ 'NumRegIdTrib': num_reg_id_trib,
+ 'ResidenciaFiscal': residencia_fiscal,
+ 'NumEstacion': num_estacion,
+ 'NombreEstacion': nombre_estacion,
+ 'NavegacionTrafico': navegacion_trafico,
+ 'TipoEstacion': tipo_estacion,
+ 'DistanciaRecorrida': distancia_recorrida,
+ 'Domicilio': domicilio,
+ })
+
+
+class CartaPorte(CFDI):
+ """
+ Complemento para incorporar al Comprobante Fiscal Digital por Internet (CFDI), la información relacionada a los bienes y/o mercancías, ubicaciones de origen, puntos intermedios y destinos, así como lo referente al medio por el que se transportan; que circulen por vía terrestre, férrea, aérea o naveguen por vía marítima; además de incluir el traslado de hidrocarburos y petrolíferos.
+
+ :param id_ccp: Atributo requerido para expresar los 36 caracteres del folio del complemento Carta Porte (IdCCP) de la transacción de timbrado conforme al estándar RFC 4122, para la identificación del CFDI con complemento Carta Porte.
+ :param transp_internac: Atributo requerido para expresar si los bienes y/o mercancías que son transportadas ingresan o salen del territorio nacional.
+ :param ubicaciones: Nodo requerido para registrar las distintas ubicaciones que sirven para indicar el domicilio del origen y/o destino que tienen los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param mercancias: Nodo requerido para registrar la información de los bienes y/o mercancías que se trasladan en los distintos medios de transporte.
+ :param entrada_salida_merc: Atributo condicional para precisar si los bienes y/o mercancías ingresan o salen del territorio nacional.
+ :param pais_origen_destino: Atributo condicional para registrar la clave del país de origen o destino de los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param via_entrada_salida: Atributo condicional para registrar la vía de ingreso o salida de los bienes y/o mercancías en territorio nacional.
+ :param total_dist_rec: Atributo condicional para indicar en kilómetros, la suma de las distancias recorridas, registradas en el atributo “DistanciaRecorrida”, para el traslado de los bienes y/o mercancías.
+ :param registro_istmo: Atributo opcional para registrar las regiones, sí el traslado de los bienes y/o mercancías se realiza al interior de los Polos de Desarrollo para el Bienestar del istmo de Tehuantepec.
+ :param ubicacion_polo_origen: Atributo condicional para registrar la región en donde inicia el traslado de los bienes y/o mercancias al interior de los Polos de Desarrollo para el Bienestar del istmo de Tehuantepec.
+ :param ubicacion_polo_destino: Atributo condicional para registrar la región en donde termina el traslado de los bienes y/o mercancias al interior de los Polos de Desarrollo para el Bienestar del istmo de Tehuantepec.
+ :param regimenes_aduaneros: Nodo condicional para registrar los distintos tipos de regímenes aduaneros a los cuales se destinan los bienes y/o mercancías que se trasladan a través de los distintos medios de transporte.
+ :param figura_transporte: Nodo condicional para indicar los datos de la(s) figura(s) del transporte que interviene(n) en el traslado de los bienes y/o mercancías realizado a través de los distintos medios de transporte dentro del territorio nacional, cuando el dueño de dicho medio sea diferente del emisor del comprobante con el complemento Carta Porte.
+ """
+
+ tag = '{http://www.sat.gob.mx/CartaPorte31}CartaPorte'
+ version = '3.1'
+
+ def __init__(
+ self,
+ id_ccp: str,
+ transp_internac: str,
+ ubicaciones: Ubicacion | dict | Sequence[Ubicacion | dict],
+ mercancias: Mercancias | dict,
+ entrada_salida_merc: str = None,
+ pais_origen_destino: str = None,
+ via_entrada_salida: str = None,
+ total_dist_rec: Decimal | int = None,
+ registro_istmo: str = None,
+ ubicacion_polo_origen: str = None,
+ ubicacion_polo_destino: str = None,
+ regimenes_aduaneros: str | Sequence[str] = None,
+ figura_transporte: TiposFigura | dict | Sequence[TiposFigura | dict] = None,
+ ):
+ super().__init__({
+ 'Version': self.version,
+ 'IdCCP': id_ccp,
+ 'TranspInternac': transp_internac,
+ 'Ubicaciones': ubicaciones,
+ 'Mercancias': mercancias,
+ 'EntradaSalidaMerc': entrada_salida_merc,
+ 'PaisOrigenDestino': pais_origen_destino,
+ 'ViaEntradaSalida': via_entrada_salida,
+ 'TotalDistRec': total_dist_rec,
+ 'RegistroISTMO': registro_istmo,
+ 'UbicacionPoloOrigen': ubicacion_polo_origen,
+ 'UbicacionPoloDestino': ubicacion_polo_destino,
+ 'RegimenesAduaneros': regimenes_aduaneros,
+ 'FiguraTransporte': figura_transporte,
+ })
+
+
diff --git a/satcfdi/transform/objectify.py b/satcfdi/transform/objectify.py
index 0251418..aa1dd34 100644
--- a/satcfdi/transform/objectify.py
+++ b/satcfdi/transform/objectify.py
@@ -11787,6 +11787,431 @@ def domicilio8(cls, node):
self['Pais'] = catalog_code('C756_c_Pais', node.attrib['Pais'])
self['CodigoPostal'] = node.attrib['CodigoPostal']
return self
+def carta_porte3(cls, node):
+ self = cls()
+ self.tag = node.tag
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}RegimenesAduaneros')
+ if el is not None:
+ self['RegimenesAduaneros'] = [regimen_aduanero_ccp0(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/CartaPorte31}RegimenAduaneroCCP')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Ubicaciones')
+ self['Ubicaciones'] = [ubicacion4(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/CartaPorte31}Ubicacion')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Mercancias')
+ self['Mercancias'] = mercancias3(cls, el)
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}FiguraTransporte')
+ if el is not None:
+ self['FiguraTransporte'] = [tipos_figura2(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/CartaPorte31}TiposFigura')]
+ self['Version'] = node.attrib['Version']
+ self['IdCCP'] = node.attrib['IdCCP']
+ self['TranspInternac'] = node.attrib['TranspInternac']
+ if (a := node.attrib.get('EntradaSalidaMerc')) is not None:
+ self['EntradaSalidaMerc'] = a
+ if (a := node.attrib.get('PaisOrigenDestino')) is not None:
+ self['PaisOrigenDestino'] = catalog_code('C756_c_Pais', a)
+ if (a := node.attrib.get('ViaEntradaSalida')) is not None:
+ self['ViaEntradaSalida'] = catalog_code('C592_c_CveTransporte', a)
+ if (a := node.attrib.get('TotalDistRec')) is not None:
+ self['TotalDistRec'] = Decimal(a)
+ if (a := node.attrib.get('RegistroISTMO')) is not None:
+ self['RegistroISTMO'] = a
+ if (a := node.attrib.get('UbicacionPoloOrigen')) is not None:
+ self['UbicacionPoloOrigen'] = a
+ if (a := node.attrib.get('UbicacionPoloDestino')) is not None:
+ self['UbicacionPoloDestino'] = a
+ return self
+def regimen_aduanero_ccp0(cls, node):
+ return node.attrib['RegimenAduanero']
+def ubicacion4(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Domicilio')
+ if el is not None:
+ self['Domicilio'] = domicilio9(cls, el)
+ self['TipoUbicacion'] = node.attrib['TipoUbicacion']
+ if (a := node.attrib.get('IDUbicacion')) is not None:
+ self['IDUbicacion'] = a
+ self['RFCRemitenteDestinatario'] = node.attrib['RFCRemitenteDestinatario']
+ if (a := node.attrib.get('NombreRemitenteDestinatario')) is not None:
+ self['NombreRemitenteDestinatario'] = a
+ if (a := node.attrib.get('NumRegIdTrib')) is not None:
+ self['NumRegIdTrib'] = a
+ if (a := node.attrib.get('ResidenciaFiscal')) is not None:
+ self['ResidenciaFiscal'] = catalog_code('C756_c_Pais', a)
+ if (a := node.attrib.get('NumEstacion')) is not None:
+ self['NumEstacion'] = catalog_code('C592_c_Estaciones', a)
+ if (a := node.attrib.get('NombreEstacion')) is not None:
+ self['NombreEstacion'] = a
+ if (a := node.attrib.get('NavegacionTrafico')) is not None:
+ self['NavegacionTrafico'] = a
+ self['FechaHoraSalidaLlegada'] = datetime.fromisoformat(node.attrib['FechaHoraSalidaLlegada'])
+ if (a := node.attrib.get('TipoEstacion')) is not None:
+ self['TipoEstacion'] = catalog_code('C592_c_TipoEstacion', a)
+ if (a := node.attrib.get('DistanciaRecorrida')) is not None:
+ self['DistanciaRecorrida'] = Decimal(a)
+ return self
+def domicilio9(cls, node):
+ self = ScalarMap()
+ if (a := node.attrib.get('Calle')) is not None:
+ self['Calle'] = a
+ if (a := node.attrib.get('NumeroExterior')) is not None:
+ self['NumeroExterior'] = a
+ if (a := node.attrib.get('NumeroInterior')) is not None:
+ self['NumeroInterior'] = a
+ if (a := node.attrib.get('Colonia')) is not None:
+ self['Colonia'] = a
+ if (a := node.attrib.get('Localidad')) is not None:
+ self['Localidad'] = a
+ if (a := node.attrib.get('Referencia')) is not None:
+ self['Referencia'] = a
+ if (a := node.attrib.get('Municipio')) is not None:
+ self['Municipio'] = a
+ self['Estado'] = node.attrib['Estado']
+ self['Pais'] = catalog_code('C756_c_Pais', node.attrib['Pais'])
+ self['CodigoPostal'] = node.attrib['CodigoPostal']
+ return self
+def mercancias3(cls, node):
+ self = ScalarMap()
+ self['Mercancia'] = [mercancia3(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}Mercancia')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Autotransporte')
+ if el is not None:
+ self['Autotransporte'] = autotransporte2(cls, el)
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}TransporteMaritimo')
+ if el is not None:
+ self['TransporteMaritimo'] = transporte_maritimo3(cls, el)
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}TransporteAereo')
+ if el is not None:
+ self['TransporteAereo'] = transporte_aereo3(cls, el)
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}TransporteFerroviario')
+ if el is not None:
+ self['TransporteFerroviario'] = transporte_ferroviario3(cls, el)
+ self['PesoBrutoTotal'] = Decimal(node.attrib['PesoBrutoTotal'])
+ self['UnidadPeso'] = catalog_code('C592_c_ClaveUnidadPeso', node.attrib['UnidadPeso'])
+ if (a := node.attrib.get('PesoNetoTotal')) is not None:
+ self['PesoNetoTotal'] = Decimal(a)
+ self['NumTotalMercancias'] = Xint(node.attrib['NumTotalMercancias'])
+ if (a := node.attrib.get('CargoPorTasacion')) is not None:
+ self['CargoPorTasacion'] = Decimal(a)
+ if (a := node.attrib.get('LogisticaInversaRecoleccionDevolucion')) is not None:
+ self['LogisticaInversaRecoleccionDevolucion'] = a
+ return self
+def mercancia3(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}DocumentacionAduanera')
+ if el is not None:
+ self['DocumentacionAduanera'] = [documentacion_aduanera1(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}DocumentacionAduanera')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}GuiasIdentificacion')
+ if el is not None:
+ self['GuiasIdentificacion'] = [guias_identificacion2(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}GuiasIdentificacion')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}CantidadTransporta')
+ if el is not None:
+ self['CantidadTransporta'] = [cantidad_transporta3(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}CantidadTransporta')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}DetalleMercancia')
+ if el is not None:
+ self['DetalleMercancia'] = detalle_mercancia3(cls, el)
+ self['BienesTransp'] = catalog_code('C592_c_ClaveProdServCP', node.attrib['BienesTransp'])
+ if (a := node.attrib.get('ClaveSTCC')) is not None:
+ self['ClaveSTCC'] = a
+ self['Descripcion'] = node.attrib['Descripcion']
+ self['Cantidad'] = Decimal(node.attrib['Cantidad'])
+ self['ClaveUnidad'] = catalog_code('C756_c_ClaveUnidad', node.attrib['ClaveUnidad'])
+ if (a := node.attrib.get('Unidad')) is not None:
+ self['Unidad'] = a
+ if (a := node.attrib.get('Dimensiones')) is not None:
+ self['Dimensiones'] = a
+ if (a := node.attrib.get('MaterialPeligroso')) is not None:
+ self['MaterialPeligroso'] = a
+ if (a := node.attrib.get('CveMaterialPeligroso')) is not None:
+ self['CveMaterialPeligroso'] = catalog_code('C592_c_MaterialPeligroso', a)
+ if (a := node.attrib.get('Embalaje')) is not None:
+ self['Embalaje'] = catalog_code('C592_c_TipoEmbalaje', a)
+ if (a := node.attrib.get('DescripEmbalaje')) is not None:
+ self['DescripEmbalaje'] = a
+ if (a := node.attrib.get('SectorCOFEPRIS')) is not None:
+ self['SectorCOFEPRIS'] = a
+ if (a := node.attrib.get('NombreIngredienteActivo')) is not None:
+ self['NombreIngredienteActivo'] = a
+ if (a := node.attrib.get('NomQuimico')) is not None:
+ self['NomQuimico'] = a
+ if (a := node.attrib.get('DenominacionGenericaProd')) is not None:
+ self['DenominacionGenericaProd'] = a
+ if (a := node.attrib.get('DenominacionDistintivaProd')) is not None:
+ self['DenominacionDistintivaProd'] = a
+ if (a := node.attrib.get('Fabricante')) is not None:
+ self['Fabricante'] = a
+ if (a := node.attrib.get('FechaCaducidad')) is not None:
+ self['FechaCaducidad'] = date.fromisoformat(a)
+ if (a := node.attrib.get('LoteMedicamento')) is not None:
+ self['LoteMedicamento'] = a
+ if (a := node.attrib.get('FormaFarmaceutica')) is not None:
+ self['FormaFarmaceutica'] = a
+ if (a := node.attrib.get('CondicionesEspTransp')) is not None:
+ self['CondicionesEspTransp'] = a
+ if (a := node.attrib.get('RegistroSanitarioFolioAutorizacion')) is not None:
+ self['RegistroSanitarioFolioAutorizacion'] = a
+ if (a := node.attrib.get('PermisoImportacion')) is not None:
+ self['PermisoImportacion'] = a
+ if (a := node.attrib.get('FolioImpoVUCEM')) is not None:
+ self['FolioImpoVUCEM'] = a
+ if (a := node.attrib.get('NumCAS')) is not None:
+ self['NumCAS'] = a
+ if (a := node.attrib.get('RazonSocialEmpImp')) is not None:
+ self['RazonSocialEmpImp'] = a
+ if (a := node.attrib.get('NumRegSanPlagCOFEPRIS')) is not None:
+ self['NumRegSanPlagCOFEPRIS'] = a
+ if (a := node.attrib.get('DatosFabricante')) is not None:
+ self['DatosFabricante'] = a
+ if (a := node.attrib.get('DatosFormulador')) is not None:
+ self['DatosFormulador'] = a
+ if (a := node.attrib.get('DatosMaquilador')) is not None:
+ self['DatosMaquilador'] = a
+ if (a := node.attrib.get('UsoAutorizado')) is not None:
+ self['UsoAutorizado'] = a
+ self['PesoEnKg'] = Decimal(node.attrib['PesoEnKg'])
+ if (a := node.attrib.get('ValorMercancia')) is not None:
+ self['ValorMercancia'] = Decimal(a)
+ if (a := node.attrib.get('Moneda')) is not None:
+ self['Moneda'] = catalog_code('C756_c_Moneda', a, 0)
+ if (a := node.attrib.get('FraccionArancelaria')) is not None:
+ self['FraccionArancelaria'] = catalog_code('C5bc_c_FraccionArancelaria', a)
+ if (a := node.attrib.get('UUIDComercioExt')) is not None:
+ self['UUIDComercioExt'] = a
+ if (a := node.attrib.get('TipoMateria')) is not None:
+ self['TipoMateria'] = a
+ if (a := node.attrib.get('DescripcionMateria')) is not None:
+ self['DescripcionMateria'] = a
+ return self
+def documentacion_aduanera1(cls, node):
+ self = ScalarMap()
+ self['TipoDocumento'] = node.attrib['TipoDocumento']
+ if (a := node.attrib.get('NumPedimento')) is not None:
+ self['NumPedimento'] = a
+ if (a := node.attrib.get('IdentDocAduanero')) is not None:
+ self['IdentDocAduanero'] = a
+ if (a := node.attrib.get('RFCImpo')) is not None:
+ self['RFCImpo'] = a
+ return self
+def guias_identificacion2(cls, node):
+ self = ScalarMap()
+ self['NumeroGuiaIdentificacion'] = node.attrib['NumeroGuiaIdentificacion']
+ self['DescripGuiaIdentificacion'] = node.attrib['DescripGuiaIdentificacion']
+ self['PesoGuiaIdentificacion'] = Decimal(node.attrib['PesoGuiaIdentificacion'])
+ return self
+def cantidad_transporta3(cls, node):
+ self = ScalarMap()
+ self['Cantidad'] = Decimal(node.attrib['Cantidad'])
+ self['IDOrigen'] = node.attrib['IDOrigen']
+ self['IDDestino'] = node.attrib['IDDestino']
+ if (a := node.attrib.get('CvesTransporte')) is not None:
+ self['CvesTransporte'] = catalog_code('C592_c_CveTransporte', a)
+ return self
+def detalle_mercancia3(cls, node):
+ self = ScalarMap()
+ self['UnidadPesoMerc'] = catalog_code('C592_c_ClaveUnidadPeso', node.attrib['UnidadPesoMerc'])
+ self['PesoBruto'] = Decimal(node.attrib['PesoBruto'])
+ self['PesoNeto'] = Decimal(node.attrib['PesoNeto'])
+ self['PesoTara'] = Decimal(node.attrib['PesoTara'])
+ if (a := node.attrib.get('NumPiezas')) is not None:
+ self['NumPiezas'] = Xint(a)
+ return self
+def autotransporte2(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}IdentificacionVehicular')
+ self['IdentificacionVehicular'] = identificacion_vehicular3(cls, el)
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Seguros')
+ self['Seguros'] = seguros2(cls, el)
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Remolques')
+ if el is not None:
+ self['Remolques'] = [remolque3(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/CartaPorte31}Remolque')]
+ self['PermSCT'] = catalog_code('C592_c_TipoPermiso', node.attrib['PermSCT'])
+ self['NumPermisoSCT'] = node.attrib['NumPermisoSCT']
+ return self
+def identificacion_vehicular3(cls, node):
+ self = ScalarMap()
+ self['ConfigVehicular'] = catalog_code('C592_c_ConfigAutotransporte', node.attrib['ConfigVehicular'])
+ self['PesoBrutoVehicular'] = Decimal(node.attrib['PesoBrutoVehicular'])
+ self['PlacaVM'] = node.attrib['PlacaVM']
+ self['AnioModeloVM'] = Xint(node.attrib['AnioModeloVM'])
+ return self
+def seguros2(cls, node):
+ self = ScalarMap()
+ self['AseguraRespCivil'] = node.attrib['AseguraRespCivil']
+ self['PolizaRespCivil'] = node.attrib['PolizaRespCivil']
+ if (a := node.attrib.get('AseguraMedAmbiente')) is not None:
+ self['AseguraMedAmbiente'] = a
+ if (a := node.attrib.get('PolizaMedAmbiente')) is not None:
+ self['PolizaMedAmbiente'] = a
+ if (a := node.attrib.get('AseguraCarga')) is not None:
+ self['AseguraCarga'] = a
+ if (a := node.attrib.get('PolizaCarga')) is not None:
+ self['PolizaCarga'] = a
+ if (a := node.attrib.get('PrimaSeguro')) is not None:
+ self['PrimaSeguro'] = Decimal(a)
+ return self
+def remolque3(cls, node):
+ self = ScalarMap()
+ self['SubTipoRem'] = catalog_code('C592_c_SubTipoRem', node.attrib['SubTipoRem'])
+ self['Placa'] = node.attrib['Placa']
+ return self
+def transporte_maritimo3(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Contenedor')
+ if el is not None:
+ self['Contenedor'] = [contenedor6(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}Contenedor')]
+ if (a := node.attrib.get('PermSCT')) is not None:
+ self['PermSCT'] = catalog_code('C592_c_TipoPermiso', a)
+ if (a := node.attrib.get('NumPermisoSCT')) is not None:
+ self['NumPermisoSCT'] = a
+ if (a := node.attrib.get('NombreAseg')) is not None:
+ self['NombreAseg'] = a
+ if (a := node.attrib.get('NumPolizaSeguro')) is not None:
+ self['NumPolizaSeguro'] = a
+ self['TipoEmbarcacion'] = catalog_code('C592_c_ConfigMaritima', node.attrib['TipoEmbarcacion'])
+ self['Matricula'] = node.attrib['Matricula']
+ self['NumeroOMI'] = node.attrib['NumeroOMI']
+ if (a := node.attrib.get('AnioEmbarcacion')) is not None:
+ self['AnioEmbarcacion'] = Xint(a)
+ if (a := node.attrib.get('NombreEmbarc')) is not None:
+ self['NombreEmbarc'] = a
+ self['NacionalidadEmbarc'] = catalog_code('C756_c_Pais', node.attrib['NacionalidadEmbarc'])
+ self['UnidadesDeArqBruto'] = Decimal(node.attrib['UnidadesDeArqBruto'])
+ self['TipoCarga'] = catalog_code('C592_c_ClaveTipoCarga', node.attrib['TipoCarga'])
+ if (a := node.attrib.get('Eslora')) is not None:
+ self['Eslora'] = Decimal(a)
+ if (a := node.attrib.get('Manga')) is not None:
+ self['Manga'] = Decimal(a)
+ if (a := node.attrib.get('Calado')) is not None:
+ self['Calado'] = Decimal(a)
+ if (a := node.attrib.get('Puntal')) is not None:
+ self['Puntal'] = Decimal(a)
+ if (a := node.attrib.get('LineaNaviera')) is not None:
+ self['LineaNaviera'] = a
+ self['NombreAgenteNaviero'] = node.attrib['NombreAgenteNaviero']
+ self['NumAutorizacionNaviero'] = catalog_code('C592_c_NumAutorizacionNaviero', node.attrib['NumAutorizacionNaviero'])
+ if (a := node.attrib.get('NumViaje')) is not None:
+ self['NumViaje'] = a
+ if (a := node.attrib.get('NumConocEmbarc')) is not None:
+ self['NumConocEmbarc'] = a
+ if (a := node.attrib.get('PermisoTempNavegacion')) is not None:
+ self['PermisoTempNavegacion'] = a
+ return self
+def contenedor6(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}RemolquesCCP')
+ if el is not None:
+ self['RemolquesCCP'] = [remolque_ccp1(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/CartaPorte31}RemolqueCCP')]
+ self['TipoContenedor'] = catalog_code('C592_c_ContenedorMaritimo', node.attrib['TipoContenedor'])
+ if (a := node.attrib.get('MatriculaContenedor')) is not None:
+ self['MatriculaContenedor'] = a
+ if (a := node.attrib.get('NumPrecinto')) is not None:
+ self['NumPrecinto'] = a
+ if (a := node.attrib.get('IdCCPRelacionado')) is not None:
+ self['IdCCPRelacionado'] = a
+ if (a := node.attrib.get('PlacaVMCCP')) is not None:
+ self['PlacaVMCCP'] = a
+ if (a := node.attrib.get('FechaCertificacionCCP')) is not None:
+ self['FechaCertificacionCCP'] = datetime.fromisoformat(a)
+ return self
+def remolque_ccp1(cls, node):
+ self = ScalarMap()
+ self['SubTipoRemCCP'] = catalog_code('C592_c_SubTipoRem', node.attrib['SubTipoRemCCP'])
+ self['PlacaCCP'] = node.attrib['PlacaCCP']
+ return self
+def transporte_aereo3(cls, node):
+ self = ScalarMap()
+ self['PermSCT'] = catalog_code('C592_c_TipoPermiso', node.attrib['PermSCT'])
+ self['NumPermisoSCT'] = node.attrib['NumPermisoSCT']
+ if (a := node.attrib.get('MatriculaAeronave')) is not None:
+ self['MatriculaAeronave'] = a
+ if (a := node.attrib.get('NombreAseg')) is not None:
+ self['NombreAseg'] = a
+ if (a := node.attrib.get('NumPolizaSeguro')) is not None:
+ self['NumPolizaSeguro'] = a
+ self['NumeroGuia'] = node.attrib['NumeroGuia']
+ if (a := node.attrib.get('LugarContrato')) is not None:
+ self['LugarContrato'] = a
+ self['CodigoTransportista'] = catalog_code('C592_c_CodigoTransporteAereo', node.attrib['CodigoTransportista'])
+ if (a := node.attrib.get('RFCEmbarcador')) is not None:
+ self['RFCEmbarcador'] = a
+ if (a := node.attrib.get('NumRegIdTribEmbarc')) is not None:
+ self['NumRegIdTribEmbarc'] = a
+ if (a := node.attrib.get('ResidenciaFiscalEmbarc')) is not None:
+ self['ResidenciaFiscalEmbarc'] = catalog_code('C756_c_Pais', a)
+ if (a := node.attrib.get('NombreEmbarcador')) is not None:
+ self['NombreEmbarcador'] = a
+ return self
+def transporte_ferroviario3(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}DerechosDePaso')
+ if el is not None:
+ self['DerechosDePaso'] = [derechos_de_paso3(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}DerechosDePaso')]
+ self['Carro'] = [carro3(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}Carro')]
+ self['TipoDeServicio'] = catalog_code('C592_c_TipoDeServicio', node.attrib['TipoDeServicio'])
+ self['TipoDeTrafico'] = catalog_code('C592_c_TipoDeTrafico', node.attrib['TipoDeTrafico'])
+ if (a := node.attrib.get('NombreAseg')) is not None:
+ self['NombreAseg'] = a
+ if (a := node.attrib.get('NumPolizaSeguro')) is not None:
+ self['NumPolizaSeguro'] = a
+ return self
+def derechos_de_paso3(cls, node):
+ self = ScalarMap()
+ self['TipoDerechoDePaso'] = catalog_code('C592_c_DerechosDePaso', node.attrib['TipoDerechoDePaso'])
+ self['KilometrajePagado'] = Decimal(node.attrib['KilometrajePagado'])
+ return self
+def carro3(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Contenedor')
+ if el is not None:
+ self['Contenedor'] = [contenedor7(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}Contenedor')]
+ self['TipoCarro'] = catalog_code('C592_c_TipoCarro', node.attrib['TipoCarro'])
+ self['MatriculaCarro'] = node.attrib['MatriculaCarro']
+ self['GuiaCarro'] = node.attrib['GuiaCarro']
+ self['ToneladasNetasCarro'] = Decimal(node.attrib['ToneladasNetasCarro'])
+ return self
+def contenedor7(cls, node):
+ self = ScalarMap()
+ self['TipoContenedor'] = catalog_code('C592_c_Contenedor', node.attrib['TipoContenedor'])
+ self['PesoContenedorVacio'] = Decimal(node.attrib['PesoContenedorVacio'])
+ self['PesoNetoMercancia'] = Decimal(node.attrib['PesoNetoMercancia'])
+ return self
+def tipos_figura2(cls, node):
+ self = ScalarMap()
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}PartesTransporte')
+ if el is not None:
+ self['PartesTransporte'] = [partes_transporte2(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/CartaPorte31}PartesTransporte')]
+ el = node.find('{http://www.sat.gob.mx/CartaPorte31}Domicilio')
+ if el is not None:
+ self['Domicilio'] = domicilioa(cls, el)
+ self['TipoFigura'] = catalog_code('C592_c_FiguraTransporte', node.attrib['TipoFigura'])
+ if (a := node.attrib.get('RFCFigura')) is not None:
+ self['RFCFigura'] = a
+ if (a := node.attrib.get('NumLicencia')) is not None:
+ self['NumLicencia'] = a
+ self['NombreFigura'] = node.attrib['NombreFigura']
+ if (a := node.attrib.get('NumRegIdTribFigura')) is not None:
+ self['NumRegIdTribFigura'] = a
+ if (a := node.attrib.get('ResidenciaFiscalFigura')) is not None:
+ self['ResidenciaFiscalFigura'] = catalog_code('C756_c_Pais', a)
+ return self
+def partes_transporte2(cls, node):
+ return catalog_code('C592_c_ParteTransporte', node.attrib['ParteTransporte'])
+def domicilioa(cls, node):
+ self = ScalarMap()
+ if (a := node.attrib.get('Calle')) is not None:
+ self['Calle'] = a
+ if (a := node.attrib.get('NumeroExterior')) is not None:
+ self['NumeroExterior'] = a
+ if (a := node.attrib.get('NumeroInterior')) is not None:
+ self['NumeroInterior'] = a
+ if (a := node.attrib.get('Colonia')) is not None:
+ self['Colonia'] = a
+ if (a := node.attrib.get('Localidad')) is not None:
+ self['Localidad'] = a
+ if (a := node.attrib.get('Referencia')) is not None:
+ self['Referencia'] = a
+ if (a := node.attrib.get('Municipio')) is not None:
+ self['Municipio'] = a
+ self['Estado'] = node.attrib['Estado']
+ self['Pais'] = catalog_code('C756_c_Pais', node.attrib['Pais'])
+ self['CodigoPostal'] = node.attrib['CodigoPostal']
+ return self
def comercio_exterior0(cls, node):
self = cls()
self.tag = node.tag
@@ -11804,7 +12229,7 @@ def comercio_exterior0(cls, node):
self['Destinatario'] = [destinatario1(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/ComercioExterior11}Destinatario')]
el = node.find('{http://www.sat.gob.mx/ComercioExterior11}Mercancias')
if el is not None:
- self['Mercancias'] = [mercancia3(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/ComercioExterior11}Mercancia')]
+ self['Mercancias'] = [mercancia4(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/ComercioExterior11}Mercancia')]
self['Version'] = node.attrib['Version']
if (a := node.attrib.get('MotivoTraslado')) is not None:
self['MotivoTraslado'] = catalog_code('C5bc_c_MotivoTraslado', a)
@@ -11832,11 +12257,11 @@ def emisor6(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior11}Domicilio')
if el is not None:
- self['Domicilio'] = domicilio9(cls, el)
+ self['Domicilio'] = domiciliob(cls, el)
if (a := node.attrib.get('Curp')) is not None:
self['Curp'] = a
return self
-def domicilio9(cls, node):
+def domiciliob(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -11864,11 +12289,11 @@ def receptor6(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior11}Domicilio')
if el is not None:
- self['Domicilio'] = domicilioa(cls, el)
+ self['Domicilio'] = domicilioc(cls, el)
if (a := node.attrib.get('NumRegIdTrib')) is not None:
self['NumRegIdTrib'] = a
return self
-def domicilioa(cls, node):
+def domicilioc(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -11889,13 +12314,13 @@ def domicilioa(cls, node):
return self
def destinatario1(cls, node):
self = ScalarMap()
- self['Domicilio'] = [domiciliob(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/ComercioExterior11}Domicilio')]
+ self['Domicilio'] = [domiciliod(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/ComercioExterior11}Domicilio')]
if (a := node.attrib.get('NumRegIdTrib')) is not None:
self['NumRegIdTrib'] = a
if (a := node.attrib.get('Nombre')) is not None:
self['Nombre'] = a
return self
-def domiciliob(cls, node):
+def domiciliod(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -11914,7 +12339,7 @@ def domiciliob(cls, node):
self['Pais'] = catalog_code('C756_c_Pais', node.attrib['Pais'])
self['CodigoPostal'] = node.attrib['CodigoPostal']
return self
-def mercancia3(cls, node):
+def mercancia4(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior11}DescripcionesEspecificas')
if el is not None:
@@ -11956,7 +12381,7 @@ def comercio_exterior1(cls, node):
if el is not None:
self['Destinatario'] = [destinatario2(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/ComercioExterior20}Destinatario')]
el = node.find('{http://www.sat.gob.mx/ComercioExterior20}Mercancias')
- self['Mercancias'] = [mercancia4(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/ComercioExterior20}Mercancia')]
+ self['Mercancias'] = [mercancia5(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/ComercioExterior20}Mercancia')]
self['Version'] = node.attrib['Version']
if (a := node.attrib.get('MotivoTraslado')) is not None:
self['MotivoTraslado'] = catalog_code('C5bc_c_MotivoTraslado', a)
@@ -11976,11 +12401,11 @@ def comercio_exterior1(cls, node):
def emisor7(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior20}Domicilio')
- self['Domicilio'] = domicilioc(cls, el)
+ self['Domicilio'] = domicilioe(cls, el)
if (a := node.attrib.get('Curp')) is not None:
self['Curp'] = a
return self
-def domicilioc(cls, node):
+def domicilioe(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -12008,11 +12433,11 @@ def receptor7(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior20}Domicilio')
if el is not None:
- self['Domicilio'] = domiciliod(cls, el)
+ self['Domicilio'] = domiciliof(cls, el)
if (a := node.attrib.get('NumRegIdTrib')) is not None:
self['NumRegIdTrib'] = a
return self
-def domiciliod(cls, node):
+def domiciliof(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -12033,13 +12458,13 @@ def domiciliod(cls, node):
return self
def destinatario2(cls, node):
self = ScalarMap()
- self['Domicilio'] = [domicilioe(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/ComercioExterior20}Domicilio')]
+ self['Domicilio'] = [domicilio10(cls, n) for n in node.iterfind('{http://www.sat.gob.mx/ComercioExterior20}Domicilio')]
if (a := node.attrib.get('NumRegIdTrib')) is not None:
self['NumRegIdTrib'] = a
if (a := node.attrib.get('Nombre')) is not None:
self['Nombre'] = a
return self
-def domicilioe(cls, node):
+def domicilio10(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -12058,7 +12483,7 @@ def domicilioe(cls, node):
self['Pais'] = catalog_code('C756_c_Pais', node.attrib['Pais'])
self['CodigoPostal'] = node.attrib['CodigoPostal']
return self
-def mercancia4(cls, node):
+def mercancia5(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior20}DescripcionesEspecificas')
if el is not None:
@@ -12097,7 +12522,7 @@ def comercio_exterior2(cls, node):
self['Destinatario'] = destinatario3(cls, el)
el = node.find('{http://www.sat.gob.mx/ComercioExterior}Mercancias')
if el is not None:
- self['Mercancias'] = [mercancia5(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/ComercioExterior}Mercancia')]
+ self['Mercancias'] = [mercancia6(cls, n) for n in el.iterfind('{http://www.sat.gob.mx/ComercioExterior}Mercancia')]
self['Version'] = node.attrib['Version']
self['TipoOperacion'] = catalog_code('C5bc_c_TipoOperacion', node.attrib['TipoOperacion'])
if (a := node.attrib.get('ClaveDePedimento')) is not None:
@@ -12133,7 +12558,7 @@ def receptor8(cls, node):
def destinatario3(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior}Domicilio')
- self['Domicilio'] = domiciliof(cls, el)
+ self['Domicilio'] = domicilio11(cls, el)
if (a := node.attrib.get('NumRegIdTrib')) is not None:
self['NumRegIdTrib'] = a
if (a := node.attrib.get('Rfc')) is not None:
@@ -12143,7 +12568,7 @@ def destinatario3(cls, node):
if (a := node.attrib.get('Nombre')) is not None:
self['Nombre'] = a
return self
-def domiciliof(cls, node):
+def domicilio11(cls, node):
self = ScalarMap()
self['Calle'] = node.attrib['Calle']
if (a := node.attrib.get('NumeroExterior')) is not None:
@@ -12162,7 +12587,7 @@ def domiciliof(cls, node):
self['Pais'] = catalog_code('C756_c_Pais', node.attrib['Pais'])
self['CodigoPostal'] = node.attrib['CodigoPostal']
return self
-def mercancia5(cls, node):
+def mercancia6(cls, node):
self = ScalarMap()
el = node.find('{http://www.sat.gob.mx/ComercioExterior}DescripcionesEspecificas')
if el is not None:
@@ -14359,6 +14784,10 @@ def s_carta_porte2(cls, node):
if node.attrib.get('Version') == '3.0':
return carta_porte2(cls, node)
raise NamespaceMismatchError(node)
+def s_carta_porte3(cls, node):
+ if node.attrib.get('Version') == '3.1':
+ return carta_porte3(cls, node)
+ raise NamespaceMismatchError(node)
def s_comercio_exterior0(cls, node):
if node.attrib.get('Version') == '1.1':
return comercio_exterior0(cls, node)
@@ -14623,6 +15052,7 @@ def s_rsakey_value0(cls, node):
'{http://www.sat.gob.mx/CartaPorte}CartaPorte': s_carta_porte0,
'{http://www.sat.gob.mx/CartaPorte20}CartaPorte': s_carta_porte1,
'{http://www.sat.gob.mx/CartaPorte30}CartaPorte': s_carta_porte2,
+ '{http://www.sat.gob.mx/CartaPorte31}CartaPorte': s_carta_porte3,
'{http://www.sat.gob.mx/ComercioExterior11}ComercioExterior': s_comercio_exterior0,
'{http://www.sat.gob.mx/ComercioExterior20}ComercioExterior': s_comercio_exterior1,
'{http://www.sat.gob.mx/ComercioExterior}ComercioExterior': s_comercio_exterior2,
diff --git a/satcfdi/transform/schemas.py b/satcfdi/transform/schemas.py
index 0fb3294..3aabe35 100644
--- a/satcfdi/transform/schemas.py
+++ b/satcfdi/transform/schemas.py
@@ -3932,6 +3932,10 @@ def carta_porte2(col, data):
col.add_map('cartaporte30', 'http://www.sat.gob.mx/CartaPorte30')
col.add_schema('http://www.sat.gob.mx/CartaPorte30 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte30.xsd')
col.add_base('www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte30.xsd')
+def carta_porte3(col, data):
+ col.add_map('cartaporte31', 'http://www.sat.gob.mx/CartaPorte31')
+ col.add_schema('http://www.sat.gob.mx/CartaPorte31 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd')
+ col.add_base('www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd')
def comercio_exterior0(col, data):
col.add_map('cce11', 'http://www.sat.gob.mx/ComercioExterior11')
col.add_schema('http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd')
@@ -4244,6 +4248,9 @@ def s_carta_porte1(col, data):
def s_carta_porte2(col, data):
if data.get('Version') == '3.0':
carta_porte2(col, data)
+def s_carta_porte3(col, data):
+ if data.get('Version') == '3.1':
+ carta_porte3(col, data)
def s_comercio_exterior0(col, data):
if data.get('Version') == '1.1':
comercio_exterior0(col, data)
@@ -4470,6 +4477,7 @@ def s_rsakey_value0(col, data):
'{http://www.sat.gob.mx/CartaPorte}CartaPorte': s_carta_porte0,
'{http://www.sat.gob.mx/CartaPorte20}CartaPorte': s_carta_porte1,
'{http://www.sat.gob.mx/CartaPorte30}CartaPorte': s_carta_porte2,
+ '{http://www.sat.gob.mx/CartaPorte31}CartaPorte': s_carta_porte3,
'{http://www.sat.gob.mx/ComercioExterior11}ComercioExterior': s_comercio_exterior0,
'{http://www.sat.gob.mx/ComercioExterior20}ComercioExterior': s_comercio_exterior1,
'{http://www.sat.gob.mx/ComercioExterior}ComercioExterior': s_comercio_exterior2,
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/catalogos/catRetenciones.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/catalogos/catRetenciones.xsd
index 78231d8..b08b239 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/catalogos/catRetenciones.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/catalogos/catRetenciones.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros/pagosaextranjeros.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros/pagosaextranjeros.xsd
index f9267fc..0fdd3ad 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros/pagosaextranjeros.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros/pagosaextranjeros.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cadenaoriginal_4_0/cadenaoriginal_4_0.xslt b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cadenaoriginal_4_0/cadenaoriginal_4_0.xslt
index 3edc01a..462a661 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cadenaoriginal_4_0/cadenaoriginal_4_0.xslt
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cadenaoriginal_4_0/cadenaoriginal_4_0.xslt
@@ -1 +1 @@
-|||
\ No newline at end of file
+|||
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd
index 56a1bbe..0493c46 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd
new file mode 100644
index 0000000..152769f
--- /dev/null
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xslt b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xslt
new file mode 100644
index 0000000..3550b66
--- /dev/null
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xslt
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/CartaPorte/catCartaPorte.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/CartaPorte/catCartaPorte.xsd
index 67defe0..9bde016 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/CartaPorte/catCartaPorte.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/CartaPorte/catCartaPorte.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/ComExt/catComExt.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/ComExt/catComExt.xsd
index 50a2396..fd2e150 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/ComExt/catComExt.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/catalogos/ComExt/catComExt.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd
index 66a105c..8b3b891 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/notariospublicos/notariospublicos.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/notariospublicos/notariospublicos.xsd
index 1d3c7ea..dd39d07 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/notariospublicos/notariospublicos.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/notariospublicos/notariospublicos.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd
index 641d561..069cc52 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/tipoDatos/tdCFDI/tdCFDI.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/valesdedespensa/valesdedespensa.xsd b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/valesdedespensa/valesdedespensa.xsd
index 6272fd3..8491f46 100644
--- a/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/valesdedespensa/valesdedespensa.xsd
+++ b/satcfdi/transform/schemas/www.sat.gob.mx/sitio_internet/cfd/valesdedespensa/valesdedespensa.xsd
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/satcfdi/transform/xmlify.py b/satcfdi/transform/xmlify.py
index c711a94..150c260 100644
--- a/satcfdi/transform/xmlify.py
+++ b/satcfdi/transform/xmlify.py
@@ -12391,6 +12391,457 @@ def domicilio8(name, data):
self.attrib['Pais'] = strcode(data['Pais'])
self.attrib['CodigoPostal'] = data['CodigoPostal']
return self
+def carta_porte3(name, data):
+ col = SchemaCollector()
+ cfdi_schemas[data.tag](col, data)
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=col.nsmap)
+ el = data.get('RegimenesAduaneros')
+ if el is not None:
+ st = SubElement(self, '{http://www.sat.gob.mx/CartaPorte31}RegimenesAduaneros')
+ for r in iterate(el):
+ st.append(regimen_aduanero_ccp0('RegimenAduaneroCCP', r))
+ el = data['Ubicaciones']
+ st = SubElement(self, '{http://www.sat.gob.mx/CartaPorte31}Ubicaciones')
+ for r in iterate(el):
+ st.append(ubicacion4('Ubicacion', r))
+ el = data['Mercancias']
+ self.append(mercancias3('Mercancias', el))
+ el = data.get('FiguraTransporte')
+ if el is not None:
+ st = SubElement(self, '{http://www.sat.gob.mx/CartaPorte31}FiguraTransporte')
+ for r in iterate(el):
+ st.append(tipos_figura2('TiposFigura', r))
+ self.attrib['Version'] = data['Version']
+ self.attrib['IdCCP'] = data['IdCCP']
+ self.attrib['TranspInternac'] = data['TranspInternac']
+ if (a := data.get('EntradaSalidaMerc')) is not None:
+ self.attrib['EntradaSalidaMerc'] = a
+ if (a := data.get('PaisOrigenDestino')) is not None:
+ self.attrib['PaisOrigenDestino'] = strcode(a)
+ if (a := data.get('ViaEntradaSalida')) is not None:
+ self.attrib['ViaEntradaSalida'] = strcode(a)
+ if (a := data.get('TotalDistRec')) is not None:
+ self.attrib['TotalDistRec'] = fmt_decimal(a)
+ if (a := data.get('RegistroISTMO')) is not None:
+ self.attrib['RegistroISTMO'] = a
+ if (a := data.get('UbicacionPoloOrigen')) is not None:
+ self.attrib['UbicacionPoloOrigen'] = a
+ if (a := data.get('UbicacionPoloDestino')) is not None:
+ self.attrib['UbicacionPoloDestino'] = a
+ return self
+def regimen_aduanero_ccp0(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap={'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['RegimenAduanero'] = data
+ return self
+def ubicacion4(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('Domicilio')
+ if el is not None:
+ self.append(domicilio9('Domicilio', el))
+ self.attrib['TipoUbicacion'] = data['TipoUbicacion']
+ if (a := data.get('IDUbicacion')) is not None:
+ self.attrib['IDUbicacion'] = a
+ self.attrib['RFCRemitenteDestinatario'] = str(data['RFCRemitenteDestinatario'])
+ if (a := data.get('NombreRemitenteDestinatario')) is not None:
+ self.attrib['NombreRemitenteDestinatario'] = a
+ if (a := data.get('NumRegIdTrib')) is not None:
+ self.attrib['NumRegIdTrib'] = a
+ if (a := data.get('ResidenciaFiscal')) is not None:
+ self.attrib['ResidenciaFiscal'] = strcode(a)
+ if (a := data.get('NumEstacion')) is not None:
+ self.attrib['NumEstacion'] = strcode(a)
+ if (a := data.get('NombreEstacion')) is not None:
+ self.attrib['NombreEstacion'] = a
+ if (a := data.get('NavegacionTrafico')) is not None:
+ self.attrib['NavegacionTrafico'] = a
+ self.attrib['FechaHoraSalidaLlegada'] = data['FechaHoraSalidaLlegada'].isoformat(timespec='seconds')
+ if (a := data.get('TipoEstacion')) is not None:
+ self.attrib['TipoEstacion'] = strcode(a)
+ if (a := data.get('DistanciaRecorrida')) is not None:
+ self.attrib['DistanciaRecorrida'] = fmt_decimal(a)
+ return self
+def domicilio9(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ if (a := data.get('Calle')) is not None:
+ self.attrib['Calle'] = a
+ if (a := data.get('NumeroExterior')) is not None:
+ self.attrib['NumeroExterior'] = a
+ if (a := data.get('NumeroInterior')) is not None:
+ self.attrib['NumeroInterior'] = a
+ if (a := data.get('Colonia')) is not None:
+ self.attrib['Colonia'] = a
+ if (a := data.get('Localidad')) is not None:
+ self.attrib['Localidad'] = a
+ if (a := data.get('Referencia')) is not None:
+ self.attrib['Referencia'] = a
+ if (a := data.get('Municipio')) is not None:
+ self.attrib['Municipio'] = a
+ self.attrib['Estado'] = data['Estado']
+ self.attrib['Pais'] = strcode(data['Pais'])
+ self.attrib['CodigoPostal'] = data['CodigoPostal']
+ return self
+def mercancias3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data['Mercancia']
+ for r in iterate(el):
+ self.append(mercancia3('Mercancia', r))
+ el = data.get('Autotransporte')
+ if el is not None:
+ self.append(autotransporte2('Autotransporte', el))
+ el = data.get('TransporteMaritimo')
+ if el is not None:
+ self.append(transporte_maritimo3('TransporteMaritimo', el))
+ el = data.get('TransporteAereo')
+ if el is not None:
+ self.append(transporte_aereo3('TransporteAereo', el))
+ el = data.get('TransporteFerroviario')
+ if el is not None:
+ self.append(transporte_ferroviario3('TransporteFerroviario', el))
+ self.attrib['PesoBrutoTotal'] = fmt_decimal(data['PesoBrutoTotal'])
+ self.attrib['UnidadPeso'] = strcode(data['UnidadPeso'])
+ if (a := data.get('PesoNetoTotal')) is not None:
+ self.attrib['PesoNetoTotal'] = fmt_decimal(a)
+ self.attrib['NumTotalMercancias'] = str(data['NumTotalMercancias'])
+ if (a := data.get('CargoPorTasacion')) is not None:
+ self.attrib['CargoPorTasacion'] = fmt_decimal(a)
+ if (a := data.get('LogisticaInversaRecoleccionDevolucion')) is not None:
+ self.attrib['LogisticaInversaRecoleccionDevolucion'] = a
+ return self
+def mercancia3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('DocumentacionAduanera')
+ if el is not None:
+ for r in iterate(el):
+ self.append(documentacion_aduanera1('DocumentacionAduanera', r))
+ el = data.get('GuiasIdentificacion')
+ if el is not None:
+ for r in iterate(el):
+ self.append(guias_identificacion2('GuiasIdentificacion', r))
+ el = data.get('CantidadTransporta')
+ if el is not None:
+ for r in iterate(el):
+ self.append(cantidad_transporta3('CantidadTransporta', r))
+ el = data.get('DetalleMercancia')
+ if el is not None:
+ self.append(detalle_mercancia3('DetalleMercancia', el))
+ self.attrib['BienesTransp'] = strcode(data['BienesTransp'])
+ if (a := data.get('ClaveSTCC')) is not None:
+ self.attrib['ClaveSTCC'] = a
+ self.attrib['Descripcion'] = data['Descripcion']
+ self.attrib['Cantidad'] = fmt_decimal(data['Cantidad'])
+ self.attrib['ClaveUnidad'] = strcode(data['ClaveUnidad'])
+ if (a := data.get('Unidad')) is not None:
+ self.attrib['Unidad'] = a
+ if (a := data.get('Dimensiones')) is not None:
+ self.attrib['Dimensiones'] = a
+ if (a := data.get('MaterialPeligroso')) is not None:
+ self.attrib['MaterialPeligroso'] = a
+ if (a := data.get('CveMaterialPeligroso')) is not None:
+ self.attrib['CveMaterialPeligroso'] = strcode(a)
+ if (a := data.get('Embalaje')) is not None:
+ self.attrib['Embalaje'] = strcode(a)
+ if (a := data.get('DescripEmbalaje')) is not None:
+ self.attrib['DescripEmbalaje'] = a
+ if (a := data.get('SectorCOFEPRIS')) is not None:
+ self.attrib['SectorCOFEPRIS'] = a
+ if (a := data.get('NombreIngredienteActivo')) is not None:
+ self.attrib['NombreIngredienteActivo'] = a
+ if (a := data.get('NomQuimico')) is not None:
+ self.attrib['NomQuimico'] = a
+ if (a := data.get('DenominacionGenericaProd')) is not None:
+ self.attrib['DenominacionGenericaProd'] = a
+ if (a := data.get('DenominacionDistintivaProd')) is not None:
+ self.attrib['DenominacionDistintivaProd'] = a
+ if (a := data.get('Fabricante')) is not None:
+ self.attrib['Fabricante'] = a
+ if (a := data.get('FechaCaducidad')) is not None:
+ self.attrib['FechaCaducidad'] = a.isoformat()
+ if (a := data.get('LoteMedicamento')) is not None:
+ self.attrib['LoteMedicamento'] = a
+ if (a := data.get('FormaFarmaceutica')) is not None:
+ self.attrib['FormaFarmaceutica'] = a
+ if (a := data.get('CondicionesEspTransp')) is not None:
+ self.attrib['CondicionesEspTransp'] = a
+ if (a := data.get('RegistroSanitarioFolioAutorizacion')) is not None:
+ self.attrib['RegistroSanitarioFolioAutorizacion'] = a
+ if (a := data.get('PermisoImportacion')) is not None:
+ self.attrib['PermisoImportacion'] = a
+ if (a := data.get('FolioImpoVUCEM')) is not None:
+ self.attrib['FolioImpoVUCEM'] = a
+ if (a := data.get('NumCAS')) is not None:
+ self.attrib['NumCAS'] = a
+ if (a := data.get('RazonSocialEmpImp')) is not None:
+ self.attrib['RazonSocialEmpImp'] = a
+ if (a := data.get('NumRegSanPlagCOFEPRIS')) is not None:
+ self.attrib['NumRegSanPlagCOFEPRIS'] = a
+ if (a := data.get('DatosFabricante')) is not None:
+ self.attrib['DatosFabricante'] = a
+ if (a := data.get('DatosFormulador')) is not None:
+ self.attrib['DatosFormulador'] = a
+ if (a := data.get('DatosMaquilador')) is not None:
+ self.attrib['DatosMaquilador'] = a
+ if (a := data.get('UsoAutorizado')) is not None:
+ self.attrib['UsoAutorizado'] = a
+ self.attrib['PesoEnKg'] = fmt_decimal(data['PesoEnKg'])
+ if (a := data.get('ValorMercancia')) is not None:
+ self.attrib['ValorMercancia'] = fmt_decimal(a)
+ if (a := data.get('Moneda')) is not None:
+ self.attrib['Moneda'] = strcode(a)
+ if (a := data.get('FraccionArancelaria')) is not None:
+ self.attrib['FraccionArancelaria'] = strcode(a)
+ if (a := data.get('UUIDComercioExt')) is not None:
+ self.attrib['UUIDComercioExt'] = str(a)
+ if (a := data.get('TipoMateria')) is not None:
+ self.attrib['TipoMateria'] = a
+ if (a := data.get('DescripcionMateria')) is not None:
+ self.attrib['DescripcionMateria'] = a
+ return self
+def documentacion_aduanera1(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['TipoDocumento'] = data['TipoDocumento']
+ if (a := data.get('NumPedimento')) is not None:
+ self.attrib['NumPedimento'] = a
+ if (a := data.get('IdentDocAduanero')) is not None:
+ self.attrib['IdentDocAduanero'] = a
+ if (a := data.get('RFCImpo')) is not None:
+ self.attrib['RFCImpo'] = str(a)
+ return self
+def guias_identificacion2(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['NumeroGuiaIdentificacion'] = data['NumeroGuiaIdentificacion']
+ self.attrib['DescripGuiaIdentificacion'] = data['DescripGuiaIdentificacion']
+ self.attrib['PesoGuiaIdentificacion'] = fmt_decimal(data['PesoGuiaIdentificacion'])
+ return self
+def cantidad_transporta3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['Cantidad'] = fmt_decimal(data['Cantidad'])
+ self.attrib['IDOrigen'] = data['IDOrigen']
+ self.attrib['IDDestino'] = data['IDDestino']
+ if (a := data.get('CvesTransporte')) is not None:
+ self.attrib['CvesTransporte'] = strcode(a)
+ return self
+def detalle_mercancia3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['UnidadPesoMerc'] = strcode(data['UnidadPesoMerc'])
+ self.attrib['PesoBruto'] = fmt_decimal(data['PesoBruto'])
+ self.attrib['PesoNeto'] = fmt_decimal(data['PesoNeto'])
+ self.attrib['PesoTara'] = fmt_decimal(data['PesoTara'])
+ if (a := data.get('NumPiezas')) is not None:
+ self.attrib['NumPiezas'] = str(a)
+ return self
+def autotransporte2(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data['IdentificacionVehicular']
+ self.append(identificacion_vehicular3('IdentificacionVehicular', el))
+ el = data['Seguros']
+ self.append(seguros2('Seguros', el))
+ el = data.get('Remolques')
+ if el is not None:
+ st = SubElement(self, '{http://www.sat.gob.mx/CartaPorte31}Remolques')
+ for r in iterate(el):
+ st.append(remolque3('Remolque', r))
+ self.attrib['PermSCT'] = strcode(data['PermSCT'])
+ self.attrib['NumPermisoSCT'] = data['NumPermisoSCT']
+ return self
+def identificacion_vehicular3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['ConfigVehicular'] = strcode(data['ConfigVehicular'])
+ self.attrib['PesoBrutoVehicular'] = fmt_decimal(data['PesoBrutoVehicular'])
+ self.attrib['PlacaVM'] = data['PlacaVM']
+ self.attrib['AnioModeloVM'] = str(data['AnioModeloVM'])
+ return self
+def seguros2(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['AseguraRespCivil'] = data['AseguraRespCivil']
+ self.attrib['PolizaRespCivil'] = data['PolizaRespCivil']
+ if (a := data.get('AseguraMedAmbiente')) is not None:
+ self.attrib['AseguraMedAmbiente'] = a
+ if (a := data.get('PolizaMedAmbiente')) is not None:
+ self.attrib['PolizaMedAmbiente'] = a
+ if (a := data.get('AseguraCarga')) is not None:
+ self.attrib['AseguraCarga'] = a
+ if (a := data.get('PolizaCarga')) is not None:
+ self.attrib['PolizaCarga'] = a
+ if (a := data.get('PrimaSeguro')) is not None:
+ self.attrib['PrimaSeguro'] = fmt_decimal(a)
+ return self
+def remolque3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['SubTipoRem'] = strcode(data['SubTipoRem'])
+ self.attrib['Placa'] = data['Placa']
+ return self
+def transporte_maritimo3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('Contenedor')
+ if el is not None:
+ for r in iterate(el):
+ self.append(contenedor6('Contenedor', r))
+ if (a := data.get('PermSCT')) is not None:
+ self.attrib['PermSCT'] = strcode(a)
+ if (a := data.get('NumPermisoSCT')) is not None:
+ self.attrib['NumPermisoSCT'] = a
+ if (a := data.get('NombreAseg')) is not None:
+ self.attrib['NombreAseg'] = a
+ if (a := data.get('NumPolizaSeguro')) is not None:
+ self.attrib['NumPolizaSeguro'] = a
+ self.attrib['TipoEmbarcacion'] = strcode(data['TipoEmbarcacion'])
+ self.attrib['Matricula'] = data['Matricula']
+ self.attrib['NumeroOMI'] = data['NumeroOMI']
+ if (a := data.get('AnioEmbarcacion')) is not None:
+ self.attrib['AnioEmbarcacion'] = str(a)
+ if (a := data.get('NombreEmbarc')) is not None:
+ self.attrib['NombreEmbarc'] = a
+ self.attrib['NacionalidadEmbarc'] = strcode(data['NacionalidadEmbarc'])
+ self.attrib['UnidadesDeArqBruto'] = fmt_decimal(data['UnidadesDeArqBruto'])
+ self.attrib['TipoCarga'] = strcode(data['TipoCarga'])
+ if (a := data.get('Eslora')) is not None:
+ self.attrib['Eslora'] = fmt_decimal(a)
+ if (a := data.get('Manga')) is not None:
+ self.attrib['Manga'] = fmt_decimal(a)
+ if (a := data.get('Calado')) is not None:
+ self.attrib['Calado'] = fmt_decimal(a)
+ if (a := data.get('Puntal')) is not None:
+ self.attrib['Puntal'] = fmt_decimal(a)
+ if (a := data.get('LineaNaviera')) is not None:
+ self.attrib['LineaNaviera'] = a
+ self.attrib['NombreAgenteNaviero'] = data['NombreAgenteNaviero']
+ self.attrib['NumAutorizacionNaviero'] = strcode(data['NumAutorizacionNaviero'])
+ if (a := data.get('NumViaje')) is not None:
+ self.attrib['NumViaje'] = a
+ if (a := data.get('NumConocEmbarc')) is not None:
+ self.attrib['NumConocEmbarc'] = a
+ if (a := data.get('PermisoTempNavegacion')) is not None:
+ self.attrib['PermisoTempNavegacion'] = a
+ return self
+def contenedor6(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('RemolquesCCP')
+ if el is not None:
+ st = SubElement(self, '{http://www.sat.gob.mx/CartaPorte31}RemolquesCCP')
+ for r in iterate(el):
+ st.append(remolque_ccp1('RemolqueCCP', r))
+ self.attrib['TipoContenedor'] = strcode(data['TipoContenedor'])
+ if (a := data.get('MatriculaContenedor')) is not None:
+ self.attrib['MatriculaContenedor'] = a
+ if (a := data.get('NumPrecinto')) is not None:
+ self.attrib['NumPrecinto'] = a
+ if (a := data.get('IdCCPRelacionado')) is not None:
+ self.attrib['IdCCPRelacionado'] = a
+ if (a := data.get('PlacaVMCCP')) is not None:
+ self.attrib['PlacaVMCCP'] = a
+ if (a := data.get('FechaCertificacionCCP')) is not None:
+ self.attrib['FechaCertificacionCCP'] = a.isoformat(timespec='seconds')
+ return self
+def remolque_ccp1(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['SubTipoRemCCP'] = strcode(data['SubTipoRemCCP'])
+ self.attrib['PlacaCCP'] = data['PlacaCCP']
+ return self
+def transporte_aereo3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['PermSCT'] = strcode(data['PermSCT'])
+ self.attrib['NumPermisoSCT'] = data['NumPermisoSCT']
+ if (a := data.get('MatriculaAeronave')) is not None:
+ self.attrib['MatriculaAeronave'] = a
+ if (a := data.get('NombreAseg')) is not None:
+ self.attrib['NombreAseg'] = a
+ if (a := data.get('NumPolizaSeguro')) is not None:
+ self.attrib['NumPolizaSeguro'] = a
+ self.attrib['NumeroGuia'] = data['NumeroGuia']
+ if (a := data.get('LugarContrato')) is not None:
+ self.attrib['LugarContrato'] = a
+ self.attrib['CodigoTransportista'] = strcode(data['CodigoTransportista'])
+ if (a := data.get('RFCEmbarcador')) is not None:
+ self.attrib['RFCEmbarcador'] = str(a)
+ if (a := data.get('NumRegIdTribEmbarc')) is not None:
+ self.attrib['NumRegIdTribEmbarc'] = a
+ if (a := data.get('ResidenciaFiscalEmbarc')) is not None:
+ self.attrib['ResidenciaFiscalEmbarc'] = strcode(a)
+ if (a := data.get('NombreEmbarcador')) is not None:
+ self.attrib['NombreEmbarcador'] = a
+ return self
+def transporte_ferroviario3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('DerechosDePaso')
+ if el is not None:
+ for r in iterate(el):
+ self.append(derechos_de_paso3('DerechosDePaso', r))
+ el = data['Carro']
+ for r in iterate(el):
+ self.append(carro3('Carro', r))
+ self.attrib['TipoDeServicio'] = strcode(data['TipoDeServicio'])
+ self.attrib['TipoDeTrafico'] = strcode(data['TipoDeTrafico'])
+ if (a := data.get('NombreAseg')) is not None:
+ self.attrib['NombreAseg'] = a
+ if (a := data.get('NumPolizaSeguro')) is not None:
+ self.attrib['NumPolizaSeguro'] = a
+ return self
+def derechos_de_paso3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['TipoDerechoDePaso'] = strcode(data['TipoDerechoDePaso'])
+ self.attrib['KilometrajePagado'] = fmt_decimal(data['KilometrajePagado'])
+ return self
+def carro3(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('Contenedor')
+ if el is not None:
+ for r in iterate(el):
+ self.append(contenedor7('Contenedor', r))
+ self.attrib['TipoCarro'] = strcode(data['TipoCarro'])
+ self.attrib['MatriculaCarro'] = data['MatriculaCarro']
+ self.attrib['GuiaCarro'] = data['GuiaCarro']
+ self.attrib['ToneladasNetasCarro'] = fmt_decimal(data['ToneladasNetasCarro'])
+ return self
+def contenedor7(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['TipoContenedor'] = strcode(data['TipoContenedor'])
+ self.attrib['PesoContenedorVacio'] = fmt_decimal(data['PesoContenedorVacio'])
+ self.attrib['PesoNetoMercancia'] = fmt_decimal(data['PesoNetoMercancia'])
+ return self
+def tipos_figura2(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ el = data.get('PartesTransporte')
+ if el is not None:
+ for r in iterate(el):
+ self.append(partes_transporte2('PartesTransporte', r))
+ el = data.get('Domicilio')
+ if el is not None:
+ self.append(domicilioa('Domicilio', el))
+ self.attrib['TipoFigura'] = strcode(data['TipoFigura'])
+ if (a := data.get('RFCFigura')) is not None:
+ self.attrib['RFCFigura'] = str(a)
+ if (a := data.get('NumLicencia')) is not None:
+ self.attrib['NumLicencia'] = a
+ self.attrib['NombreFigura'] = data['NombreFigura']
+ if (a := data.get('NumRegIdTribFigura')) is not None:
+ self.attrib['NumRegIdTribFigura'] = a
+ if (a := data.get('ResidenciaFiscalFigura')) is not None:
+ self.attrib['ResidenciaFiscalFigura'] = strcode(a)
+ return self
+def partes_transporte2(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap={'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ self.attrib['ParteTransporte'] = strcode(data)
+ return self
+def domicilioa(name, data):
+ self = Element('{%s}%s' % ('http://www.sat.gob.mx/CartaPorte31', name), nsmap=data.get('_nsmap') or {'cartaporte31': 'http://www.sat.gob.mx/CartaPorte31'})
+ if (a := data.get('Calle')) is not None:
+ self.attrib['Calle'] = a
+ if (a := data.get('NumeroExterior')) is not None:
+ self.attrib['NumeroExterior'] = a
+ if (a := data.get('NumeroInterior')) is not None:
+ self.attrib['NumeroInterior'] = a
+ if (a := data.get('Colonia')) is not None:
+ self.attrib['Colonia'] = a
+ if (a := data.get('Localidad')) is not None:
+ self.attrib['Localidad'] = a
+ if (a := data.get('Referencia')) is not None:
+ self.attrib['Referencia'] = a
+ if (a := data.get('Municipio')) is not None:
+ self.attrib['Municipio'] = a
+ self.attrib['Estado'] = data['Estado']
+ self.attrib['Pais'] = strcode(data['Pais'])
+ self.attrib['CodigoPostal'] = data['CodigoPostal']
+ return self
def comercio_exterior0(name, data):
col = SchemaCollector()
cfdi_schemas[data.tag](col, data)
@@ -12413,7 +12864,7 @@ def comercio_exterior0(name, data):
if el is not None:
st = SubElement(self, '{http://www.sat.gob.mx/ComercioExterior11}Mercancias')
for r in iterate(el):
- st.append(mercancia3('Mercancia', r))
+ st.append(mercancia4('Mercancia', r))
self.attrib['Version'] = data['Version']
if (a := data.get('MotivoTraslado')) is not None:
self.attrib['MotivoTraslado'] = strcode(a)
@@ -12441,11 +12892,11 @@ def emisor6(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
el = data.get('Domicilio')
if el is not None:
- self.append(domicilio9('Domicilio', el))
+ self.append(domiciliob('Domicilio', el))
if (a := data.get('Curp')) is not None:
self.attrib['Curp'] = a
return self
-def domicilio9(name, data):
+def domiciliob(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12473,11 +12924,11 @@ def receptor6(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
el = data.get('Domicilio')
if el is not None:
- self.append(domicilioa('Domicilio', el))
+ self.append(domicilioc('Domicilio', el))
if (a := data.get('NumRegIdTrib')) is not None:
self.attrib['NumRegIdTrib'] = a
return self
-def domicilioa(name, data):
+def domicilioc(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12500,13 +12951,13 @@ def destinatario1(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
el = data['Domicilio']
for r in iterate(el):
- self.append(domiciliob('Domicilio', r))
+ self.append(domiciliod('Domicilio', r))
if (a := data.get('NumRegIdTrib')) is not None:
self.attrib['NumRegIdTrib'] = a
if (a := data.get('Nombre')) is not None:
self.attrib['Nombre'] = a
return self
-def domiciliob(name, data):
+def domiciliod(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12525,7 +12976,7 @@ def domiciliob(name, data):
self.attrib['Pais'] = strcode(data['Pais'])
self.attrib['CodigoPostal'] = data['CodigoPostal']
return self
-def mercancia3(name, data):
+def mercancia4(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior11', name), nsmap=data.get('_nsmap') or {'cce11': 'http://www.sat.gob.mx/ComercioExterior11'})
el = data.get('DescripcionesEspecificas')
if el is not None:
@@ -12573,7 +13024,7 @@ def comercio_exterior1(name, data):
el = data['Mercancias']
st = SubElement(self, '{http://www.sat.gob.mx/ComercioExterior20}Mercancias')
for r in iterate(el):
- st.append(mercancia4('Mercancia', r))
+ st.append(mercancia5('Mercancia', r))
self.attrib['Version'] = data['Version']
if (a := data.get('MotivoTraslado')) is not None:
self.attrib['MotivoTraslado'] = strcode(a)
@@ -12593,11 +13044,11 @@ def comercio_exterior1(name, data):
def emisor7(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
el = data['Domicilio']
- self.append(domicilioc('Domicilio', el))
+ self.append(domicilioe('Domicilio', el))
if (a := data.get('Curp')) is not None:
self.attrib['Curp'] = a
return self
-def domicilioc(name, data):
+def domicilioe(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12625,11 +13076,11 @@ def receptor7(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
el = data.get('Domicilio')
if el is not None:
- self.append(domiciliod('Domicilio', el))
+ self.append(domiciliof('Domicilio', el))
if (a := data.get('NumRegIdTrib')) is not None:
self.attrib['NumRegIdTrib'] = a
return self
-def domiciliod(name, data):
+def domiciliof(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12652,13 +13103,13 @@ def destinatario2(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
el = data['Domicilio']
for r in iterate(el):
- self.append(domicilioe('Domicilio', r))
+ self.append(domicilio10('Domicilio', r))
if (a := data.get('NumRegIdTrib')) is not None:
self.attrib['NumRegIdTrib'] = a
if (a := data.get('Nombre')) is not None:
self.attrib['Nombre'] = a
return self
-def domicilioe(name, data):
+def domicilio10(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12677,7 +13128,7 @@ def domicilioe(name, data):
self.attrib['Pais'] = strcode(data['Pais'])
self.attrib['CodigoPostal'] = data['CodigoPostal']
return self
-def mercancia4(name, data):
+def mercancia5(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior20', name), nsmap=data.get('_nsmap') or {'cce20': 'http://www.sat.gob.mx/ComercioExterior20'})
el = data.get('DescripcionesEspecificas')
if el is not None:
@@ -12720,7 +13171,7 @@ def comercio_exterior2(name, data):
if el is not None:
st = SubElement(self, '{http://www.sat.gob.mx/ComercioExterior}Mercancias')
for r in iterate(el):
- st.append(mercancia5('Mercancia', r))
+ st.append(mercancia6('Mercancia', r))
self.attrib['Version'] = data['Version']
self.attrib['TipoOperacion'] = strcode(data['TipoOperacion'])
if (a := data.get('ClaveDePedimento')) is not None:
@@ -12756,7 +13207,7 @@ def receptor8(name, data):
def destinatario3(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior', name), nsmap=data.get('_nsmap') or {'cce': 'http://www.sat.gob.mx/ComercioExterior'})
el = data['Domicilio']
- self.append(domiciliof('Domicilio', el))
+ self.append(domicilio11('Domicilio', el))
if (a := data.get('NumRegIdTrib')) is not None:
self.attrib['NumRegIdTrib'] = a
if (a := data.get('Rfc')) is not None:
@@ -12766,7 +13217,7 @@ def destinatario3(name, data):
if (a := data.get('Nombre')) is not None:
self.attrib['Nombre'] = a
return self
-def domiciliof(name, data):
+def domicilio11(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior', name), nsmap=data.get('_nsmap') or {'cce': 'http://www.sat.gob.mx/ComercioExterior'})
self.attrib['Calle'] = data['Calle']
if (a := data.get('NumeroExterior')) is not None:
@@ -12785,7 +13236,7 @@ def domiciliof(name, data):
self.attrib['Pais'] = strcode(data['Pais'])
self.attrib['CodigoPostal'] = data['CodigoPostal']
return self
-def mercancia5(name, data):
+def mercancia6(name, data):
self = Element('{%s}%s' % ('http://www.sat.gob.mx/ComercioExterior', name), nsmap=data.get('_nsmap') or {'cce': 'http://www.sat.gob.mx/ComercioExterior'})
el = data.get('DescripcionesEspecificas')
if el is not None:
@@ -15154,6 +15605,10 @@ def s_carta_porte2(data):
if data.get('Version') == '3.0':
return carta_porte2('CartaPorte', data)
raise NamespaceMismatchError(data)
+def s_carta_porte3(data):
+ if data.get('Version') == '3.1':
+ return carta_porte3('CartaPorte', data)
+ raise NamespaceMismatchError(data)
def s_comercio_exterior0(data):
if data.get('Version') == '1.1':
return comercio_exterior0('ComercioExterior', data)
@@ -15418,6 +15873,7 @@ def s_rsakey_value0(data):
'{http://www.sat.gob.mx/CartaPorte}CartaPorte': s_carta_porte0,
'{http://www.sat.gob.mx/CartaPorte20}CartaPorte': s_carta_porte1,
'{http://www.sat.gob.mx/CartaPorte30}CartaPorte': s_carta_porte2,
+ '{http://www.sat.gob.mx/CartaPorte31}CartaPorte': s_carta_porte3,
'{http://www.sat.gob.mx/ComercioExterior11}ComercioExterior': s_comercio_exterior0,
'{http://www.sat.gob.mx/ComercioExterior20}ComercioExterior': s_comercio_exterior1,
'{http://www.sat.gob.mx/ComercioExterior}ComercioExterior': s_comercio_exterior2,