diff --git a/api/customs/tasks/microservice_v2.py b/api/customs/tasks/microservice_v2.py index 6e56a95..b102863 100644 --- a/api/customs/tasks/microservice_v2.py +++ b/api/customs/tasks/microservice_v2.py @@ -210,6 +210,7 @@ def procesar_pedimento_completo_individual(pedimento_id): headers={"Content-Type": "application/json"} ) print(f"Servicio enviado para pedimento {pedimento.pedimento}") + return response @shared_task def procesar_pedimentos_completos(organizacion_id): diff --git a/api/customs/views.py b/api/customs/views.py index 1cdd2fa..3bc0129 100644 --- a/api/customs/views.py +++ b/api/customs/views.py @@ -38,6 +38,8 @@ from api.logger.mixins import LoggingMixin from mixins.filtrado_organizacion import OrganizacionFiltradaMixin, ProcesosPorOrganizacionMixin import requests +from .tasks.microservice_v2 import * +from .tasks.auditoria import crear_partidas_por_pedimento class CustomPagination(PageNumberPagination): @@ -166,20 +168,10 @@ class ViewSetPedimento(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltrada if fecha_pago and aduana and patente and pedimento: pedimento_app = f"{str(fecha_pago.year)[-2:]}-{str(aduana).zfill(2)[-2:]}-{str(patente).zfill(4)[-4:]}-{str(pedimento).zfill(7)[-7:]}" serializer.save(organizacion=self.request.user.organizacion, pedimento_app=pedimento_app) - return try: # Usar el nombre del servicio de Docker Compose en lugar de localhost - response = requests.request('POST', f'{SERVICE_API_URL}/services/pedimento', params={}, - json={ - 'estado': 1, - 'servicio': 3, - 'tipo_procesamiento': 2, - 'pedimento': str(serializer.instance.id), - 'organizacion': str(self.request.user.organizacion.id), - }, - timeout=10 - ) + response = procesar_pedimento_completo_individual(serializer.instance.id) # Verificar si la respuesta fue exitosa if response.status_code == 200: @@ -201,6 +193,42 @@ class ViewSetPedimento(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltrada print(f"🚨 Error de request al servicio FastAPI: {e}") except Exception as e: print(f"💥 Error inesperado al llamar al servicio FastAPI: {e}") + + def perform_update(self, serializer): + """ + Ejecuta acciones después de actualizar un pedimento basado en los campos modificados. + """ + # Obtener los campos que se están actualizando + updated_fields = set(serializer.validated_data.keys()) + + # Guardar los cambios + pedimento = serializer.save() + + # Si se actualizó el campo existe_expediente, procesar el pedimento completo + if 'existe_expediente' in updated_fields: + # Iniciar todas las tareas + procesar_remesas_pedimento(pedimento.id) + crear_partidas_por_pedimento(pedimento.id) + procesar_acuse_coves_pedimento(pedimento.id) + procesar_edocs_pedimento(pedimento.id) + procesar_acuses_pedimento(pedimento.id) + procesar_partidas_pedimento(pedimento.id) + procesar_coves_pedimento(pedimento.id) + + # Agregar mensaje de tareas iniciadas al serializer + serializer._data = { + **serializer.data, + "message": "Tareas de procesamiento iniciadas", + "tasks": [ + "Procesamiento de remesas", + "Creación de partidas", + "Procesamiento de acuses de COVEs", + "Procesamiento de E-documents", + "Procesamiento de acuses", + "Procesamiento de partidas", + "Procesamiento de COVEs" + ] + } my_tags = ['Pedimentos'] diff --git a/api/reports/urls.py b/api/reports/urls.py index cae4f1c..48c0e1e 100644 --- a/api/reports/urls.py +++ b/api/reports/urls.py @@ -5,7 +5,7 @@ from .views import ExportModelView, dashboard_summary urlpatterns = [ path('exportmodel/', ExportModelView.as_view(), name='export-model'), - #path('dashboard/summary/', dashboard_summary, name='dashboard-summary'), + path('dashboard/summary/', dashboard_summary, name='dashboard-summary'), #path('documentos-por-fecha/', documentos_por_fecha, name='documentos-por-fecha'), #path('table-summary/', table_summary, name='table-summary'), diff --git a/api/reports/views.py b/api/reports/views.py index af3d6b1..2f5ef65 100644 --- a/api/reports/views.py +++ b/api/reports/views.py @@ -266,7 +266,19 @@ def dashboard_summary(request): cumplimiento_partidas = (partidas_descargadas / partidas_total * 100) if partidas_total else 0 + # Calcular cumplimiento total (promedio de todos los indicadores) + indicadores = [ + cumplimiento_pedimentos, + cumplimiento_coves, + cumplimiento_acuse_coves, + cumplimiento_edocs, + cumplimiento_acuses, + cumplimiento_partidas + ] + cumplimiento_total = sum(indicadores) / len(indicadores) if indicadores else 0 + return Response({ + "cumplimiento_total": round(cumplimiento_total, 2), "pedimentos": { "total": pedimentos_total, "completos": pedimentos_completos, @@ -276,19 +288,26 @@ def dashboard_summary(request): "coves": { "total": coves_total, "coves_procesados": coves_procesados, - "acuse_coves_procesados": acuse_coves_procesados, "coves_pendientes": coves_pendientes, - "acuse_coves_pendientes": acuse_coves_pendientes, "coves_cumplimiento": round(cumplimiento_coves, 2), + + }, + "acuse_coves": { + "total": coves_total, + "acuse_coves_procesados": acuse_coves_procesados, + "acuse_coves_pendientes": acuse_coves_pendientes, "acuse_coves_cumplimiento": round(cumplimiento_acuse_coves, 2) }, "edocuments": { "total": edocs_total, "edocs_descargados": edocs_descargados, "edocs_pendientes": edocs_pendientes, + "edocs_cumplimiento": round(cumplimiento_edocs, 2), + }, + "acuses":{ + "total": edocs_total, "acuse_descargados": acuse_descargados, "acuses_pendientes": acuses_pendientes, - "edocs_cumplimiento": round(cumplimiento_edocs, 2), "acuses_cumplimiento": round(cumplimiento_acuses, 2) }, "remesas": {