coves y edocuments
This commit is contained in:
@@ -129,36 +129,54 @@ def extract_acuse_documento_from_soap(soap_response_text): # Testeado
|
||||
logger.error(f"Error extrayendo acuseDocumento: {e}")
|
||||
return None
|
||||
|
||||
|
||||
def extract_pdf_bytes_from_xml(xml_path):
|
||||
tree = ET.parse(xml_path)
|
||||
root = tree.getroot()
|
||||
# Busca el tag <File> (ajusta el namespace si es necesario)
|
||||
"""
|
||||
Igual que extract_pdf_bytes_from_xml_content pero recibe una ruta de archivo.
|
||||
"""
|
||||
with open(xml_path, 'r', encoding='utf-8') as f:
|
||||
xml_content = f.read()
|
||||
return extract_pdf_bytes_from_xml_content(xml_content)
|
||||
|
||||
def extract_pdf_bytes_from_xml_content(xml_content: str):
|
||||
"""
|
||||
Extrae el PDF y metadatos desde un string XML.
|
||||
"""
|
||||
root = ET.fromstring(xml_content)
|
||||
file_elem = root.find('.//File')
|
||||
if file_elem is not None and file_elem.text:
|
||||
# Limpia el contenido base64
|
||||
if file_elem is None:
|
||||
for elem in root.iter():
|
||||
if elem.tag.endswith('File') and elem.text:
|
||||
file_elem = elem
|
||||
break
|
||||
if file_elem is not None and file_elem.text and file_elem.text.strip():
|
||||
base64_data = file_elem.text.strip().replace('\n', '').replace('\r', '')
|
||||
pdf_bytes = base64.b64decode(base64_data)
|
||||
cadena_original = None
|
||||
sello_digital = None
|
||||
|
||||
# Buscar CadenaOriginal y SelloDigital en el XML
|
||||
cadena_elem = root.find('.//CadenaOriginal')
|
||||
if cadena_elem is None:
|
||||
for elem in root.iter():
|
||||
if elem.tag.endswith('CadenaOriginal') and elem.text:
|
||||
cadena_elem = elem
|
||||
break
|
||||
if cadena_elem is not None and cadena_elem.text:
|
||||
cadena_original = cadena_elem.text.strip()
|
||||
|
||||
sello_elem = root.find('.//SelloDigital')
|
||||
if sello_elem is None:
|
||||
for elem in root.iter():
|
||||
if elem.tag.endswith('SelloDigital') and elem.text:
|
||||
sello_elem = elem
|
||||
break
|
||||
if sello_elem is not None and sello_elem.text:
|
||||
sello_digital = sello_elem.text.strip()
|
||||
|
||||
return {
|
||||
"pdf_bytes": pdf_bytes,
|
||||
"cadena_original": cadena_original,
|
||||
"sello_digital": sello_digital
|
||||
}
|
||||
return pdf_bytes
|
||||
|
||||
else:
|
||||
raise ValueError("No se encontró el tag <File> con contenido válido.")
|
||||
raise ValueError("No se encontró el tag <File> con contenido válido. Verifique que el XML contiene el tag <File> con datos base64.")
|
||||
|
||||
def decode_acuse_base64_content(base64_content): # Testeado
|
||||
"""
|
||||
@@ -846,32 +864,20 @@ async def get_soap_edocument(credenciales, response_service, soap_controller, ed
|
||||
|
||||
# Extraer contenido Base64 del acuse
|
||||
logger.info("Extrayendo documento binario del edocument...")
|
||||
response = extract_pdf_bytes_from_xml(soap_response.text)
|
||||
response = extract_pdf_bytes_from_xml_content(soap_response.text)
|
||||
pdf_bytes = response.get('pdf_bytes')
|
||||
# cadena_original = response.get('cadena_original')
|
||||
# sello_digital = response.get('sello_digital')
|
||||
|
||||
if not acuse_base64:
|
||||
logger.error("No se pudo extraer el contenido del acuseDocumento")
|
||||
raise HTTPException(status_code=500, detail="No se pudo extraer el documento del acuse")
|
||||
|
||||
# Decodificar contenido Base64
|
||||
|
||||
response_edoc = rest_controller.put_edocument(edocument_id=ide, data={
|
||||
"numero_edocument": edocument['numero_edocument'],
|
||||
"pedimento": response_service['pedimento'],
|
||||
# "cadena_original": cadena_original,
|
||||
# "sello_digital": sello_digital
|
||||
})
|
||||
if not pdf_bytes:
|
||||
logger.error("No se pudo decodificar el contenido Base64 del acuse")
|
||||
raise HTTPException(status_code=500, detail="No se pudo decodificar el documento del acuse")
|
||||
|
||||
logger.error("No se pudo decodificar el contenido Base64 del documento e-document")
|
||||
raise HTTPException(status_code=500, detail="No se pudo decodificar el documento del e-document")
|
||||
|
||||
# Verificar que es un PDF válido
|
||||
if not pdf_bytes.startswith(b'%PDF'):
|
||||
logger.warning("El contenido decodificado no parece ser un PDF válido")
|
||||
# Continuar de todos modos, podría ser otro tipo de documento
|
||||
|
||||
|
||||
# Generar nombre del archivo
|
||||
remesas = 1 if response_service['pedimento'].get('remesas', 0) else 0
|
||||
patente = response_service['pedimento'].get('patente', 'N/A')
|
||||
@@ -880,7 +886,7 @@ async def get_soap_edocument(credenciales, response_service, soap_controller, ed
|
||||
tipo_operacion = response_service['pedimento'].get('tipo_operacion', 'N/A')
|
||||
pedimento = response_service['pedimento'].get('pedimento', 'N/A')
|
||||
_file_name = f"vu_EDC_{remesas}{no_partidas}{tipo_operacion}_{aduana}_{patente}_{pedimento}_{idx}.pdf"
|
||||
|
||||
|
||||
# Enviar el documento PDF usando binary_content
|
||||
logger.info(f"Enviando documento PDF: {_file_name} ({len(pdf_bytes)} bytes)")
|
||||
document_response = await rest_controller.post_document(
|
||||
@@ -904,7 +910,7 @@ async def get_soap_edocument(credenciales, response_service, soap_controller, ed
|
||||
logger.error(f"Error inesperado en get_acuse: {e}")
|
||||
import traceback
|
||||
logger.error(f"Traceback: {traceback.format_exc()}")
|
||||
raise HTTPException(status_code=500, detail=f"Error interno al procesar acuse: {str(e)}")
|
||||
raise HTTPException(status_code=500, detail=f"Error interno al procesar acuse")
|
||||
|
||||
async def get_soap_cove(credenciales, response_service, soap_controller, cove, idx):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user