Se agregaron cambios
This commit is contained in:
@@ -283,8 +283,8 @@ async def get_listar_pedimentos(request: ServiceRemesaSchema):
|
|||||||
|
|
||||||
raise HTTPException(status_code=500, detail=f"Error interno en {operation_name}: {str(e)}")
|
raise HTTPException(status_code=500, detail=f"Error interno en {operation_name}: {str(e)}")
|
||||||
|
|
||||||
@router.post("/services/pedimento_completo")
|
@router.post("/services/pedimento")
|
||||||
async def get_pedimento_completo(request: ServiceBaseSchema):
|
async def get_pedimento(request: ServiceBaseSchema):
|
||||||
"""
|
"""
|
||||||
Obtiene el pedimento completo de VUCEM y procesa todos los documentos asociados.
|
Obtiene el pedimento completo de VUCEM y procesa todos los documentos asociados.
|
||||||
|
|
||||||
@@ -306,15 +306,13 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
|
|||||||
HTTPException: En caso de errores de validación o procesamiento
|
HTTPException: En caso de errores de validación o procesamiento
|
||||||
"""
|
"""
|
||||||
service_id = None
|
service_id = None
|
||||||
operation_name = "pedimento_completo"
|
operation_name = "pedimento"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Validar datos de entrada
|
# Validar datos de entrada
|
||||||
request_data = request.model_dump()
|
request_data = request.model_dump()
|
||||||
await _validate_request_data(request_data)
|
await _validate_request_data(request_data)
|
||||||
|
|
||||||
logger.info(f"Iniciando procesamiento de pedimento completo - Pedimento: {request_data['pedimento']}")
|
|
||||||
|
|
||||||
# Crear servicio de pedimento completo
|
# Crear servicio de pedimento completo
|
||||||
logger.info("Creando servicio de pedimento completo...")
|
logger.info("Creando servicio de pedimento completo...")
|
||||||
try:
|
try:
|
||||||
@@ -329,50 +327,84 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error al crear servicio de pedimento completo: {e}")
|
logger.error(f"Error al crear servicio de pedimento completo: {e}")
|
||||||
raise HTTPException(status_code=500, detail="Error al crear el servicio de pedimento")
|
raise HTTPException(status_code=500, detail="Error al crear el servicio de pedimento")
|
||||||
|
except HTTPException:
|
||||||
|
# Re-lanzar HTTPExceptions sin modificar
|
||||||
|
raise
|
||||||
|
|
||||||
|
return JSONResponse(content={"message": "Se creo el servicio para pedimento completo."}, status_code=202)
|
||||||
|
|
||||||
|
@router.post("/services/pedimento_completo")
|
||||||
|
async def get_pedimento_completo(request: ServiceRemesaSchema):
|
||||||
|
"""
|
||||||
|
Reintenta obtener el pedimento completo de VUCEM y procesa todos los documentos asociados.
|
||||||
|
Utiliza la lógica de get_pedimento_completo, pero con manejo de errores y respuesta como get_remesas.
|
||||||
|
"""
|
||||||
|
operation_name = "pedimento_completo_retry"
|
||||||
|
operation_name = "pedimento_completo"
|
||||||
|
service_data = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Validar datos de entrada
|
||||||
|
request_data = request.model_dump()
|
||||||
|
await _validate_request_data(request_data)
|
||||||
|
|
||||||
|
logger.info(f"Iniciando procesamiento de pedimento completo - Pedimento: {request_data['pedimento']}")
|
||||||
|
|
||||||
|
# Obtener servicio de remesas existente
|
||||||
|
service_data = await _get_pedimento_service(
|
||||||
|
pedimento_id=request_data['pedimento'],
|
||||||
|
service_type=3,
|
||||||
|
operation_name=operation_name
|
||||||
|
)
|
||||||
|
|
||||||
# Actualizar estado a "En proceso"
|
# Actualizar estado a "En proceso"
|
||||||
update_success = await _update_service_status(
|
update_success = await _update_service_status(
|
||||||
service_id, ESTADO_EN_PROCESO, response_service, operation_name
|
service_data['id'], ESTADO_EN_PROCESO, service_data, operation_name
|
||||||
)
|
)
|
||||||
if not update_success:
|
if not update_success:
|
||||||
raise HTTPException(status_code=500, detail="Error al actualizar estado del servicio")
|
raise HTTPException(status_code=500, detail="Error al actualizar estado del servicio")
|
||||||
|
|
||||||
# Obtener credenciales VUCEM
|
# Obtener credenciales VUCEM
|
||||||
contribuyente_id = response_service['pedimento']['contribuyente']
|
contribuyente_id = service_data.get('pedimento', {}).get('contribuyente', '')
|
||||||
|
if not contribuyente_id:
|
||||||
|
logger.error("No se encontró ID de contribuyente en los datos del servicio")
|
||||||
|
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
|
||||||
|
raise HTTPException(status_code=400, detail="ID de contribuyente no encontrado")
|
||||||
|
|
||||||
credentials = await _get_vucem_credentials(contribuyente_id, operation_name)
|
credentials = await _get_vucem_credentials(contribuyente_id, operation_name)
|
||||||
|
|
||||||
# Procesar petición SOAP para obtener pedimento completo
|
# Procesar petición SOAP para remesas
|
||||||
logger.info("Realizando petición SOAP para pedimento completo...")
|
logger.info("Realizando petición SOAP para remesas...")
|
||||||
try:
|
try:
|
||||||
soap_response = await get_soap_pedimento_completo(
|
soap_response = await get_soap_pedimento_completo(
|
||||||
credenciales=credentials,
|
credenciales=credentials,
|
||||||
response_service=response_service,
|
response_service=service_data,
|
||||||
soap_controller=soap_controller
|
soap_controller=soap_controller
|
||||||
)
|
)
|
||||||
|
|
||||||
if not soap_response:
|
if not soap_response:
|
||||||
raise HTTPException(status_code=500, detail="Error en la petición SOAP al servicio VUCEM")
|
raise HTTPException(status_code=500, detail="Error en la petición SOAP para remesas")
|
||||||
|
|
||||||
logger.info("Petición SOAP completada exitosamente")
|
|
||||||
|
|
||||||
|
logger.info("Petición SOAP para remesas completada exitosamente")
|
||||||
|
|
||||||
except HTTPException:
|
except HTTPException:
|
||||||
await _update_service_status(service_id, ESTADO_ERROR, response_service, operation_name)
|
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
|
||||||
raise
|
raise
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error en petición SOAP: {e}")
|
logger.error(f"Error en petición SOAP para remesas: {e}")
|
||||||
await _update_service_status(service_id, ESTADO_ERROR, response_service, operation_name)
|
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
|
||||||
raise HTTPException(status_code=500, detail="Error en la petición SOAP al servicio VUCEM")
|
raise HTTPException(status_code=500, detail="Error en la petición SOAP al servicio VUCEM")
|
||||||
|
|
||||||
# Actualizar datos del pedimento con información del XML
|
# Actualizar datos del pedimento con información del XML
|
||||||
logger.info("Actualizando datos del pedimento...")
|
logger.info("Actualizando datos del pedimento...")
|
||||||
try:
|
try:
|
||||||
xml_content = soap_response.get('xml_content', {})
|
xml_content = soap_response.get('xml_content', {})
|
||||||
|
|
||||||
if xml_content:
|
if xml_content:
|
||||||
# Excluir 'identificadores_ed' del contenido a enviar
|
# Excluir 'identificadores_ed' del contenido a enviar
|
||||||
update_content = {k: v for k, v in xml_content.items() if k != 'identificadores_ed'}
|
update_content = {k: v for k, v in xml_content.items() if k != 'identificadores_ed'}
|
||||||
|
update_content['existe_expediente'] = True
|
||||||
pedimento_response = await rest_controller.put_pedimento(
|
pedimento_response = await rest_controller.put_pedimento(
|
||||||
response_service['pedimento']['id'],
|
service_data['pedimento']['id'],
|
||||||
update_content
|
update_content
|
||||||
)
|
)
|
||||||
logger.info("Pedimento actualizado exitosamente")
|
logger.info("Pedimento actualizado exitosamente")
|
||||||
@@ -393,7 +425,7 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
|
|||||||
if identificadores_ed:
|
if identificadores_ed:
|
||||||
logger.info(f"Procesando {len(identificadores_ed)} documentos digitalizados...")
|
logger.info(f"Procesando {len(identificadores_ed)} documentos digitalizados...")
|
||||||
edocuments_result = await _post_edocuments(
|
edocuments_result = await _post_edocuments(
|
||||||
response_service=response_service,
|
response_service=service_data,
|
||||||
identificadores_ed=identificadores_ed
|
identificadores_ed=identificadores_ed
|
||||||
)
|
)
|
||||||
logger.info(f"Se procesaron exitosamente {len(edocuments_result)} documentos digitalizados")
|
logger.info(f"Se procesaron exitosamente {len(edocuments_result)} documentos digitalizados")
|
||||||
@@ -416,95 +448,29 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
|
|||||||
# Aquí podrías guardar el COVE en la base de datos o hacer algo con él
|
# Aquí podrías guardar el COVE en la base de datos o hacer algo con él
|
||||||
# Por ejemplo, podrías crear un servicio específico para manejar los coves
|
# Por ejemplo, podrías crear un servicio específico para manejar los coves
|
||||||
cove_result = await _post_coves(
|
cove_result = await _post_coves(
|
||||||
response_service=response_service,
|
response_service=service_data,
|
||||||
coves=coves
|
coves=coves
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error al procesar COVEs: {e}")
|
logger.error(f"Error al procesar COVEs: {e}")
|
||||||
# No fallar todo el proceso por este error
|
# No fallar todo el proceso por este error
|
||||||
cove_result = None
|
cove_result = None
|
||||||
# Crear servicios adicionales automáticamente
|
|
||||||
servicios_adicionales = {}
|
|
||||||
servicios_error = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
logger.info("Creando servicios adicionales...")
|
|
||||||
new_service_base = {
|
|
||||||
"pedimento": response_service['pedimento']['id'],
|
|
||||||
"organizacion": response_service['organizacion'],
|
|
||||||
"estado": ESTADO_CREADO,
|
|
||||||
"tipo_procesamiento": 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
# Mapeo de servicios a crear
|
|
||||||
servicios_config = [
|
|
||||||
(4, "partidas"), # Tipo 4 para partidas
|
|
||||||
(6, "acuse"), # Tipo 6 para acuse
|
|
||||||
(1, "estado_pedimento"), # Tipo 1 para estado_pedimento
|
|
||||||
(7, "edocument"),# Tipo 7 para edocument
|
|
||||||
]
|
|
||||||
|
|
||||||
# Agregar servicio de remesas solo si el pedimento tiene remesas
|
|
||||||
if xml_content.get('remesas', 0):
|
|
||||||
servicios_config.append((5, "remesas"))
|
|
||||||
|
|
||||||
for servicio_tipo, servicio_nombre in servicios_config:
|
|
||||||
try:
|
|
||||||
logger.info(f"Creando servicio {servicio_nombre} (tipo {servicio_tipo})...")
|
|
||||||
new_service = {**new_service_base, "servicio": servicio_tipo}
|
|
||||||
service_response = await rest_controller.post_pedimento_service(new_service)
|
|
||||||
|
|
||||||
if service_response:
|
|
||||||
servicios_adicionales[f"servicio_{servicio_nombre}"] = service_response['id']
|
|
||||||
logger.info(f"✅ Servicio {servicio_nombre} (tipo {servicio_tipo}) creado exitosamente con ID: {service_response['id']}")
|
|
||||||
else:
|
|
||||||
logger.error(f"❌ No se pudo crear el servicio {servicio_nombre} (tipo {servicio_tipo}) - respuesta vacía")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Error al crear servicio {servicio_nombre} (tipo {servicio_tipo}): {e}")
|
|
||||||
logger.error(f"Traceback: {traceback.format_exc()}")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error al crear servicios adicionales: {e}")
|
|
||||||
servicios_error = str(e)
|
|
||||||
# No fallar todo el proceso por este error
|
|
||||||
|
|
||||||
# Log resumen de servicios creados
|
|
||||||
logger.info(f"📋 Resumen servicios creados: {len(servicios_adicionales)} de {len(servicios_config)} servicios")
|
|
||||||
for servicio_nombre, servicio_id in servicios_adicionales.items():
|
|
||||||
logger.info(f" ✅ {servicio_nombre}: ID {servicio_id}")
|
|
||||||
|
|
||||||
# Finalizar servicio exitosamente
|
# Finalizar servicio exitosamente
|
||||||
await _update_service_status(service_id, ESTADO_FINALIZADO, response_service, operation_name)
|
await _update_service_status(service_data['id'], ESTADO_FINALIZADO, service_data, operation_name)
|
||||||
|
|
||||||
# Programar servicios automáticos en segundo plano
|
# Crear respuesta estandarizada
|
||||||
logger.info("Programando ejecución automática de servicios de seguimiento...")
|
|
||||||
try:
|
|
||||||
await _schedule_follow_up_services(
|
|
||||||
pedimento_id=response_service['pedimento']['id'],
|
|
||||||
organizacion_id=response_service['organizacion'],
|
|
||||||
xml_content=xml_content
|
|
||||||
)
|
|
||||||
logger.info("Servicios automáticos programados exitosamente")
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"No se pudieron programar servicios automáticos: {e}")
|
|
||||||
# No fallar el proceso principal por esto
|
|
||||||
|
|
||||||
# Construir respuesta final
|
|
||||||
response_data = await _create_response(
|
response_data = await _create_response(
|
||||||
service_data=response_service,
|
service_data=service_data,
|
||||||
additional_data={
|
additional_data={
|
||||||
"documento": soap_response.get('documento', {}),
|
"remesas": soap_response,
|
||||||
"xml_content": xml_content,
|
"documento": soap_response.get('documento', {})
|
||||||
"edocuments": edocuments_result
|
|
||||||
},
|
},
|
||||||
success_message="Pedimento completo procesado exitosamente. Servicios automáticos programados."
|
success_message="Documento completo procesado exitosamente"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
logger.info(f"Documento completo procesado exitosamente- Servicio: {service_data['id']}")
|
||||||
|
return JSONResponse(content=response_data, status_code=200)
|
||||||
|
|
||||||
logger.info(f"Pedimento completo procesado exitosamente - Servicio: {service_id}")
|
|
||||||
return JSONResponse(content=response_data, status_code=200)
|
|
||||||
except HTTPException:
|
except HTTPException:
|
||||||
# Re-lanzar HTTPExceptions sin modificar
|
# Re-lanzar HTTPExceptions sin modificar
|
||||||
raise
|
raise
|
||||||
@@ -512,12 +478,10 @@ async def get_pedimento_completo(request: ServiceBaseSchema):
|
|||||||
logger.error(f"Error inesperado en {operation_name}: {e}")
|
logger.error(f"Error inesperado en {operation_name}: {e}")
|
||||||
logger.error(f"Traceback: {traceback.format_exc()}")
|
logger.error(f"Traceback: {traceback.format_exc()}")
|
||||||
|
|
||||||
# Actualizar estado a error si tenemos el service_id
|
# Actualizar estado a error si tenemos service_data
|
||||||
if service_id:
|
if service_data:
|
||||||
try:
|
try:
|
||||||
# Necesitamos response_service para actualizar estado
|
await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name)
|
||||||
if 'response_service' in locals():
|
|
||||||
await _update_service_status(service_id, ESTADO_ERROR, response_service, operation_name)
|
|
||||||
except Exception as update_error:
|
except Exception as update_error:
|
||||||
logger.error(f"Error al actualizar estado del servicio tras fallo: {update_error}")
|
logger.error(f"Error al actualizar estado del servicio tras fallo: {update_error}")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user