# 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)}