edoc serv

This commit is contained in:
2025-10-06 00:18:02 -06:00
parent ad947b884e
commit 48db0d72d8
6 changed files with 44 additions and 50 deletions

View File

@@ -61,6 +61,7 @@ class EdocRESTController(APIRESTController):
""" """
return await self._make_request_async('PUT', f'customs/edocuments/{edocument_id}/', data=data) return await self._make_request_async('PUT', f'customs/edocuments/{edocument_id}/', data=data)
# Instancias de los controladores que serán importadas en services.py # Instancias de los controladores que serán importadas en services.py
edocs_vu_controller = EdocVuController() edocs_vu_controller = EdocVuController()
edocs_rest_controller = EdocRESTController() edocs_rest_controller = EdocRESTController()

View File

@@ -1,7 +1,7 @@
from fastapi import APIRouter, HTTPException, Depends from fastapi import APIRouter, HTTPException, Depends
from typing import Dict, Any, Optional from typing import Dict, Any, Optional
from .schemas import EdocumentsSchema, EdocumentsMasivoSchema from .schemas import EdocumentsSchema, EdocumentsMasivoSchema
from .tasks import process_edoc_download_request, process_edocs_masivo_download_request from .tasks import process_edoc_download_request
from api.api_v2.modules.authentication.services import get_current_user from api.api_v2.modules.authentication.services import get_current_user
router = APIRouter() router = APIRouter()
@@ -33,7 +33,7 @@ async def download_edocs_masivo(edoc_request: EdocumentsMasivoSchema):
edoc_dict = { edoc_dict = {
"pedimento": edoc_request_dict.get('pedimento'), "pedimento": edoc_request_dict.get('pedimento'),
"credencial": edoc_request_dict.get('credencial'), "credencial": edoc_request_dict.get('credencial'),
"edoc": edoc.get('edoc') "edoc": edoc
} }
task = process_edoc_download_request.delay(edoc_dict) task = process_edoc_download_request.delay(edoc_dict)
task_ids.append(task.id) task_ids.append(task.id)

View File

@@ -73,22 +73,22 @@ def _get_file_name(**kwargs) -> str:
# --- FUNCIONES DE SERVICIO --- # --- FUNCIONES DE SERVICIO ---
async def obtener_edoc(**kwargs): async def obtener_edoc(**kwargs):
credencial = kwargs.get('credencial', {}) credencial = kwargs.get('credencial', {})
usuario = credencial.get('user', '') usuario = credencial.get('user', '')
password = credencial.get('password', '') password = credencial.get('password', '')
doc = kwargs.get('edoc', {})
numero_documento = kwargs['edoc'].get('numero_edocument', '') numero_documento = kwargs['edoc'].get('numero_edocument', '')
soap_headers = { soap_headers = {
'Content-Type': 'text/xml; charset=utf-8', 'Content-Type': 'text/xml; charset=utf-8',
'SOAPAction': 'http://tempuri.org/IServicioEdocument/GetDocumento' 'SOAPAction': 'http://tempuri.org/IServicioEdocument/GetDocumento'
} }
soap_xml = edocs_vu_controller.generate_edocument_template(username=usuario, password=password, idEDocument=numero_documento) soap_xml = edocs_vu_controller.generate_edocument_template(username=usuario, password=password, idEDocument=numero_documento)
print(soap_xml)
response = await edocs_vu_controller.make_request_async( response = await edocs_vu_controller.make_request_async(
"Ventanilla-HA/ServicioEdocument/ServicioEdocument.svc", "Ventanilla-HA/ServicioEdocument/ServicioEdocument.svc",
data=soap_xml, data=soap_xml,
headers=soap_headers headers=soap_headers
) )
print(response.text)
if response is None: if response is None:
raise Exception("No se obtuvo respuesta del servicio SOAP.") raise Exception("No se obtuvo respuesta del servicio SOAP.")
@@ -139,10 +139,12 @@ async def obtener_edoc(**kwargs):
logger.info("Documento enviado, actualizando status de Edoc") logger.info("Documento enviado, actualizando status de Edoc")
edoc_status_response = await change_edocument_status( edoc_status_response = await change_edocument_status(
edoc=kwargs.get('edoc'), edoc=doc,
status=True, status=True,
pedimento=pedimento pedimento=pedimento
) )
print(edoc_status_response)
return { return {
"document_response": rest_response, "document_response": rest_response,
@@ -155,7 +157,7 @@ async def obtener_edoc(**kwargs):
async def change_edocument_status(edoc: dict, status: bool, pedimento: dict): async def change_edocument_status(edoc: dict, status: bool, pedimento: dict):
data = { data = {
"id": edoc.get("id"), "id": edoc.get("id"),
"edocument_descargado": status, "acuse_descargado": status,
"numero_edocument": edoc.get("numero_edocument"), "numero_edocument": edoc.get("numero_edocument"),
"pedimento": pedimento.get("id"), "pedimento": pedimento.get("id"),
"organizacion": pedimento.get("organizacion"), "organizacion": pedimento.get("organizacion"),
@@ -165,31 +167,7 @@ async def change_edocument_status(edoc: dict, status: bool, pedimento: dict):
return response return response
async def obtener_edocs_masivo(**kwargs):
logger.info("Iniciando la orquestación de descarga masiva de Edocs.")
numeros_documentos = kwargs.get("edocs", [])
if not numeros_documentos:
return {"status": "warning", "message": "No se encontraron números de documento para procesar."}
for edoc in numeros_documentos:
try:
logger.info(f"Procesando Edoc: {edoc.get('numero_edocument', 'N/A')}")
edoc = {
"edoc": edoc,
"pedimento": kwargs.get("pedimento"),
"credencial": kwargs.get("credencial")
}
await obtener_edoc(**edoc)
logger.info(f"Edoc {edoc.get('numero_edocument', 'N/A')} procesado exitosamente.")
except Exception as e:
logger.error(f"Error procesando Edoc {edoc.get('numero_edocument', 'N/A')}: {str(e)}", exc_info=True)
continue # Continuar con el siguiente edoc en caso de error
return {
"status": "pending",
"total_documentos": len(numeros_documentos),
"message": "La orquestación de descarga masiva ha sido registrada."
}
def extract_pdf_bytes_from_xml_content(xml_content: str): def extract_pdf_bytes_from_xml_content(xml_content: str):

View File

@@ -1,6 +1,6 @@
from celery_app import celery_app from celery_app import celery_app
from .services import obtener_edoc, obtener_edocs_masivo from .services import obtener_edoc
import asyncio # Necesario para ejecutar funciones async dentro de Celery import asyncio # Necesario para ejecutar funciones async dentro de Celery
@celery_app.task(bind=True) @celery_app.task(bind=True)
@@ -23,21 +23,3 @@ def process_edoc_download_request(self, edoc_data: dict):
# Es crucial volver a lanzar la excepción para que Celery la marque como fallida # Es crucial volver a lanzar la excepción para que Celery la marque como fallida
raise e raise e
@celery_app.task(bind=True)
def process_edocs_masivo_download_request(self, edoc_data: dict):
"""
Tarea de Celery para procesar la descarga de múltiples documentos edoc.
Esta tarea orquesta la ejecución, pero puede delegar en el servicio.
"""
try:
# Ejecutar la función asíncrona dentro del hilo síncrono de Celery
loop = asyncio.get_event_loop()
result = loop.run_until_complete(obtener_edocs_masivo(**edoc_data))
return {"status": "success", "result": result}
except Exception as e:
self.update_state(
state='FAILURE',
meta={'exc_type': type(e).__name__, 'exc_message': str(e)}
)
raise

View File

@@ -28,7 +28,7 @@ celery_app.autodiscover_tasks()
from api.api_v2.modules.acuses.tasks import process_acuse_request from api.api_v2.modules.acuses.tasks import process_acuse_request
from api.api_v2.modules.coves.tasks import process_cove_request, process_acuse_cove_request from api.api_v2.modules.coves.tasks import process_cove_request, process_acuse_cove_request
from api.api_v2.modules.edocs.tasks import process_edoc_download_request, process_edocs_masivo_download_request from api.api_v2.modules.edocs.tasks import process_edoc_download_request
from api.api_v2.modules.pedimentos.tasks import process_pedimento_completo_request from api.api_v2.modules.pedimentos.tasks import process_pedimento_completo_request
from api.api_v2.modules.partidas.tasks import process_partida_request from api.api_v2.modules.partidas.tasks import process_partida_request
from api.api_v2.modules.remesas.tasks import process_remesa_request from api.api_v2.modules.remesas.tasks import process_remesa_request

33
test.json Normal file
View File

@@ -0,0 +1,33 @@
"pedimento": {
"id": "82c283e9-d983-4bce-8030-89e7ade1e2df",
"pedimento": "4002664",
"pedimento_app": "24-16-1788-4002664",
"aduana": "160",
"patente": "1788",
"numero_operacion": "test",
"regimen": "test",
"organizacion": "4fea91c7-4a1d-40b3-a433-f0122b5ea43e",
"clave_pedimento": "test",
"fecha_pago": None,
"fecha_inicio": None,
"fecha_fin": None,
"alerta": None,
"agente_aduanal": None,
"curp_apoderado": None,
"importe_total": None,
"saldo_disponible": None,
"importe_pedimento": None,
"existe_expediente": None
},
"credencial": {
"id": "4db84571-8fbb-4d47-815d-28c7544652ef",
"user": "MTK861014317",
"password": "+PNjq4gtAm7IH3tAuipUNxXO2/ivgLbNdlwjV/teOc4PocnOtX/NYUiRezhxubN9",
"efirma": "MTK34200",
"key": "vucem_keys/Claveprivada_FIEL_BUGJ6305217WA_20221215_131315_oPkSEWC.key",
"cer": "vucem_certs/00001000000516774465_xSn9CUa.cer",
"is_active": True,
"organizacion": UUID("3fa85f64-5717-4562-b3fc-2c963f66afa6")
},
"edoc": None
}