194 lines
9.0 KiB
Python
194 lines
9.0 KiB
Python
# auditoria_xml.py
|
|
import xml.etree.ElementTree as ET
|
|
from datetime import datetime
|
|
|
|
def extraer_info_pedimento_xml(xml_content):
|
|
"""
|
|
Extrae información específica de un XML de pedimento.
|
|
"""
|
|
try:
|
|
# Parsear el XML
|
|
root = ET.fromstring(xml_content)
|
|
|
|
# Buscar el namespace (puede variar)
|
|
namespaces = {
|
|
'S': 'http://schemas.xmlsoap.org/soap/envelope/',
|
|
'ns2': 'http://www.ventanillaunica.gob.mx/pedimentos/ws/oxml/consultarpedimentocompleto',
|
|
'ns3': 'http://www.ventanillaunica.gob.mx/common/ws/oxml/respuesta'
|
|
}
|
|
|
|
resultado = {}
|
|
|
|
# Extraer número de operación
|
|
num_op = root.find('.//ns2:numeroOperacion', namespaces)
|
|
if num_op is not None and num_op.text:
|
|
resultado['numero_operacion'] = num_op.text
|
|
|
|
# Extraer información del pedimento
|
|
pedimento_elem = root.find('.//ns2:pedimento', namespaces)
|
|
if pedimento_elem is not None:
|
|
# Número de pedimento
|
|
ped_num = pedimento_elem.find('ns2:pedimento', namespaces)
|
|
if ped_num is not None and ped_num.text:
|
|
resultado['numero_pedimento'] = ped_num.text
|
|
|
|
# Número de partidas
|
|
partidas = pedimento_elem.find('ns2:partidas', namespaces)
|
|
if partidas is not None and partidas.text:
|
|
try:
|
|
resultado['numero_partidas'] = int(partidas.text)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
# Tipo de operación clave
|
|
tipo_op_clave = pedimento_elem.find('.//ns2:tipoOperacion/ns2:clave', namespaces)
|
|
if tipo_op_clave is not None and tipo_op_clave.text:
|
|
if tipo_op_clave.text.strip() == '1':
|
|
|
|
resultado['tipo_operacion'] = 'Importacion'
|
|
resultado['tipo_operacion_descripcion'] = 'Indica operacion como Importaciones'
|
|
|
|
elif tipo_op_clave.text.strip() == '2':
|
|
|
|
resultado['tipo_operacion'] = 'Exportacion'
|
|
resultado['tipo_operacion_descripcion'] = 'Indica operacion de exportacion'
|
|
|
|
|
|
# Clave del documento (clave_pedimento)
|
|
clave_doc = pedimento_elem.find('.//ns2:claveDocumento/ns2:clave', namespaces)
|
|
if clave_doc is not None and clave_doc.text:
|
|
resultado['clave_pedimento'] = clave_doc.text.strip()
|
|
|
|
# Aduana (patente)
|
|
aduana = pedimento_elem.find('.//ns2:aduanaEntradaSalida/ns2:clave', namespaces)
|
|
if aduana is not None and aduana.text:
|
|
resultado['aduana_clave'] = aduana.text.strip()
|
|
|
|
# Importador/Exportador
|
|
importador = pedimento_elem.find('.//ns2:importadorExportador', namespaces)
|
|
if importador is not None:
|
|
rfc = importador.find('ns2:rfc', namespaces)
|
|
if rfc is not None and rfc.text:
|
|
resultado['contribuyente_rfc'] = rfc.text.strip()
|
|
|
|
razon_social = importador.find('ns2:razonSocial', namespaces)
|
|
if razon_social is not None and razon_social.text:
|
|
resultado['contribuyente_nombre'] = razon_social.text.strip()
|
|
|
|
# Valor en dólares
|
|
valor_dolares = importador.find('ns2:valorDolares', namespaces)
|
|
if valor_dolares is not None and valor_dolares.text:
|
|
try:
|
|
resultado['valor_dolares'] = float(valor_dolares.text)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
# Aduana de despacho
|
|
aduana_despacho = importador.find('ns2:aaduanaDespacho/ns2:clave', namespaces)
|
|
if aduana_despacho is not None and aduana_despacho.text:
|
|
resultado['aduana_despacho'] = aduana_despacho.text.strip()
|
|
|
|
# Encabezado del pedimento
|
|
encabezado = pedimento_elem.find('ns2:encabezado', namespaces)
|
|
if encabezado is not None:
|
|
# Aduana
|
|
aduana = encabezado.find('ns2:aduanaEntradaSalida/ns2:clave', namespaces)
|
|
if aduana is not None and aduana.text:
|
|
resultado['aduana_clave'] = aduana.text.strip()
|
|
|
|
# Tipo de cambio
|
|
tipo_cambio = encabezado.find('ns2:tipoCambio', namespaces)
|
|
if tipo_cambio is not None and tipo_cambio.text:
|
|
try:
|
|
resultado['tipo_cambio'] = float(tipo_cambio.text)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
# RFC Agente Aduanal
|
|
rfc_agente = encabezado.find('ns2:rfcAgenteAduanalSocFactura', namespaces)
|
|
if rfc_agente is not None and rfc_agente.text:
|
|
resultado['rfc_agente_aduanal'] = rfc_agente.text.strip()
|
|
|
|
# CURP Apoderado
|
|
curp_apoderado = encabezado.find('ns2:curpApoderadomandatario', namespaces)
|
|
if curp_apoderado is not None and curp_apoderado.text:
|
|
resultado['curp_apoderado'] = curp_apoderado.text.strip()
|
|
|
|
# Valor Aduanal Total
|
|
valor_aduanal = encabezado.find('ns2:valorAduanalTotal', namespaces)
|
|
if valor_aduanal is not None and valor_aduanal.text:
|
|
try:
|
|
resultado['valor_aduanal_total'] = float(valor_aduanal.text)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
# Valor Comercial Total
|
|
valor_comercial = encabezado.find('ns2:valorComercialTotal', namespaces)
|
|
if valor_comercial is not None and valor_comercial.text:
|
|
try:
|
|
resultado['valor_comercial_total'] = float(valor_comercial.text)
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
# Fechas
|
|
fechas = pedimento_elem.findall('.//ns2:fechas', namespaces)
|
|
for fecha_elem in fechas:
|
|
fecha = fecha_elem.find('ns2:fecha', namespaces)
|
|
clave_fecha = fecha_elem.find('ns2:tipo/ns2:clave', namespaces)
|
|
|
|
if fecha is not None and fecha.text and clave_fecha is not None and clave_fecha.text:
|
|
|
|
fecha_texto = fecha.text.strip()
|
|
clave_fecha_texto = clave_fecha.text.strip()
|
|
|
|
# Mapeo de claves según especificación
|
|
if clave_fecha_texto == '1': # Entrada
|
|
resultado['fecha_entrada'] = fecha_texto
|
|
elif clave_fecha_texto == '2': # Pago
|
|
resultado['fecha_pago'] = fecha_texto
|
|
elif clave_fecha_texto == '3': # Extracción
|
|
resultado['fecha_extraccion'] = fecha_texto
|
|
elif clave_fecha_texto == '5': # Presentación
|
|
resultado['fecha_presentacion'] = fecha_texto
|
|
elif clave_fecha_texto == '6': # Importación
|
|
resultado['fecha_importacion'] = fecha_texto
|
|
elif clave_fecha_texto == '7': # Original
|
|
resultado['fecha_original'] = fecha_texto
|
|
else:
|
|
resultado[f'fecha_clave_{clave_fecha_texto}'] = fecha_texto
|
|
|
|
# Facturas (para COVEs)
|
|
facturas = pedimento_elem.findall('.//ns2:facturas', namespaces)
|
|
coves_encontrados = []
|
|
for factura in facturas:
|
|
numero = factura.find('ns2:numero', namespaces)
|
|
if numero is not None and numero.text:
|
|
coves_encontrados.append(numero.text.strip())
|
|
|
|
if coves_encontrados:
|
|
resultado['coves_en_xml'] = coves_encontrados
|
|
|
|
# E-Documents
|
|
identificadores = pedimento_elem.findall('.//ns2:identificadores/ns2:identificadores', namespaces)
|
|
edocs_encontrados = []
|
|
for ident in identificadores:
|
|
clave = ident.find('claveIdentificador/descripcion', namespaces)
|
|
complemento = ident.find('complemento1', namespaces)
|
|
if clave is not None and clave.text and 'E_DOCUMENT' in clave.text:
|
|
if complemento is not None and complemento.text:
|
|
edocs_encontrados.append(complemento.text.strip())
|
|
|
|
if edocs_encontrados:
|
|
resultado['edocuments_en_xml'] = edocs_encontrados
|
|
|
|
# Verificar si hay error en la respuesta
|
|
tiene_error = root.find('.//ns3:tieneError', namespaces)
|
|
if tiene_error is not None:
|
|
resultado['tiene_error'] = tiene_error.text.lower() == 'true'
|
|
|
|
return resultado
|
|
|
|
except ET.ParseError as e:
|
|
return {'error_parse': str(e)}
|
|
except Exception as e:
|
|
return {'error': str(e)} |