Cuser models

This commit is contained in:
2025-10-05 15:44:08 -06:00
parent 0c6dd348e7
commit 5c3df2f34c
6 changed files with 381 additions and 72 deletions

View File

@@ -1,3 +1,4 @@
from warnings import filters
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from api.customs.models import Pedimento, Cove, EDocument, Partida
@@ -143,55 +144,50 @@ class ExportModelView(APIView):
class ExportModelView(APIView):
my_tags = ['Reportes']
permission_classes = [IsAuthenticated & (
IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)]
my_tags = ['Reportes']
permission_classes = [IsAuthenticated & (
IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)]
@swagger_auto_schema(
manual_parameters=[
openapi.Parameter('model', openapi.IN_QUERY, description="Nombre del modelo (ejemplo: Registro500)",
type=openapi.TYPE_STRING, required=True)
],
responses={200: openapi.Response('Campos disponibles', schema=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'fields': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING))
}
))}
)
def get(self, request, *args, **kwargs):
"""
Devuelve los campos disponibles para el modelo solicitado.
Ejemplo: /api/reports/exportmodel/?model=Registro500
"""
model_name = request.query_params.get('model')
if not model_name:
return Response({'error': 'model is required'}, status=status.HTTP_400_BAD_REQUEST)
try:
model = apps.get_model('datastage', model_name)
except LookupError:
return Response({'error': f'Model {model_name} not found'}, status=status.HTTP_404_NOT_FOUND)
fields = [f.name for f in model._meta.fields]
return Response({'fields': fields})
@swagger_auto_schema(manual_parameters=[openapi.Parameter('model', openapi.IN_QUERY, description="Nombre del modelo (ejemplo: Registro500)",
type=openapi.TYPE_STRING, required=True)
],
responses={200: openapi.Response('Campos disponibles', schema=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'fields': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING))
}
))}
)
def get(self, request, *args, **kwargs):
"""
Devuelve los campos disponibles para el modelo solicitado.
Ejemplo: /api/reports/exportmodel/?model=Registro500
"""
model_name = request.query_params.get('model')
if not model_name:
return Response({'error': 'model is required'}, status=status.HTTP_400_BAD_REQUEST)
try:
model = apps.get_model('datastage', model_name)
except LookupError:
return Response({'error': f'Model {model_name} not found'}, status=status.HTTP_404_NOT_FOUND)
fields = [f.name for f in model._meta.fields]
return Response({'fields': fields})
@swagger_auto_schema(
request_body=ExportModelSerializer,
responses={200: 'Archivo generado (Excel o CSV)'}
)
def post(self, request, *args, **kwargs):
model_name = request.data.get('model')
fields = request.data.get('fields')
filters = request.data.get('filters', {})
export_type = request.data.get('type', 'csv')
@swagger_auto_schema(request_body=ExportModelSerializer, esponses={200: 'Archivo generado (Excel o CSV)'})
def post(self, request, *args, **kwargs):
model_name = request.data.get('model')
fields = request.data.get('fields')
filters = request.data.get('filters', {})
filters['organizacion__id'] = self.request.user.organizacion.id if hasattr(request.user, 'organizacion') and request.user.organizacion else None
export_type = request.data.get('type', 'csv')
if not model_name or not fields:
return Response({'error': 'model and fields are required'}, status=status.HTTP_400_BAD_REQUEST)
if not model_name or not fields:
return Response({'error': 'model and fields are required'}, status=status.HTTP_400_BAD_REQUEST)
module = request.data.get('module', 'datastage')
if export_type == 'excel':
return export_model_to_excel(request, model_name, fields, module, filters)
else:
return export_model_to_csv(request, model_name, fields, module, filters)
module = request.data.get('module', 'datastage')
if export_type == 'excel':
return export_model_to_excel(request, model_name, fields, module, filters)
else:
return export_model_to_csv(request, model_name, fields, module, filters)
# Resumen general para dashboard
@@ -256,29 +252,44 @@ def dashboard_summary(request):
pedimento_ids = list(pedimentos_qs.values_list('id', flat=True))
coves_total = Cove.objects.filter(pedimento_id__in=pedimento_ids).count()
coves_procesados = Cove.objects.filter(pedimento_id__in=pedimento_ids, cove_descargado=True).count()
acuse_coves_procesados = Cove.objects.filter(pedimento_id__in=pedimento_ids, acuse_cove_descargado=True).count()
coves_procesados = Cove.objects.filter(
pedimento_id__in=pedimento_ids, cove_descargado=True).count()
acuse_coves_procesados = Cove.objects.filter(
pedimento_id__in=pedimento_ids, acuse_cove_descargado=True).count()
acuse_coves_pendientes = coves_total - acuse_coves_procesados
coves_pendientes = coves_total - coves_procesados
edocs_total = EDocument.objects.filter(pedimento_id__in=pedimento_ids).count()
edocs_descargados = EDocument.objects.filter(pedimento_id__in=pedimento_ids, edocument_descargado=True).count()
acuse_descargados = EDocument.objects.filter(pedimento_id__in=pedimento_ids, acuse_descargado=True).count()
edocs_total = EDocument.objects.filter(
pedimento_id__in=pedimento_ids).count()
edocs_descargados = EDocument.objects.filter(
pedimento_id__in=pedimento_ids, edocument_descargado=True).count()
acuse_descargados = EDocument.objects.filter(
pedimento_id__in=pedimento_ids, acuse_descargado=True).count()
edocs_pendientes = edocs_total - edocs_descargados
acuses_pendientes = edocs_total - acuse_descargados
remesas_total = Document.objects.filter(document_type__id=3, pedimento_id__in=pedimento_ids).count()
documentos_descargados = Document.objects.filter(pedimento_id__in=pedimento_ids).count()
partidas_total = Partida.objects.filter(pedimento_id__in=pedimento_ids).count()
partidas_descargadas = Partida.objects.filter(pedimento_id__in=pedimento_ids, descargado=True).count()
remesas_total = Document.objects.filter(
document_type__id=3, pedimento_id__in=pedimento_ids).count()
documentos_descargados = Document.objects.filter(
pedimento_id__in=pedimento_ids).count()
partidas_total = Partida.objects.filter(
pedimento_id__in=pedimento_ids).count()
partidas_descargadas = Partida.objects.filter(
pedimento_id__in=pedimento_ids, descargado=True).count()
partidas_pendientes = partidas_total - partidas_descargadas
# Indicadores de cumplimiento
cumplimiento_pedimentos = (pedimentos_completos / pedimentos_total * 100) if pedimentos_total else 0
cumplimiento_acuse_coves = (acuse_coves_procesados / coves_total * 100) if coves_total else 0
cumplimiento_coves = (coves_procesados / coves_total * 100) if coves_total else 0
cumplimiento_edocs = (edocs_descargados / edocs_total * 100) if edocs_total else 0
cumplimiento_acuses = (acuse_descargados / edocs_total * 100) if edocs_total else 0
cumplimiento_partidas = (partidas_descargadas / partidas_total * 100) if partidas_total else 0
cumplimiento_pedimentos = (
pedimentos_completos / pedimentos_total * 100) if pedimentos_total else 0
cumplimiento_acuse_coves = (
acuse_coves_procesados / coves_total * 100) if coves_total else 0
cumplimiento_coves = (
coves_procesados / coves_total * 100) if coves_total else 0
cumplimiento_edocs = (edocs_descargados /
edocs_total * 100) if edocs_total else 0
cumplimiento_acuses = (acuse_descargados /
edocs_total * 100) if edocs_total else 0
cumplimiento_partidas = (partidas_descargadas /
partidas_total * 100) if partidas_total else 0
return Response({
"pedimentos": {
@@ -301,7 +312,7 @@ def dashboard_summary(request):
"edocs_descargados": edocs_descargados,
"edocs_pendientes": edocs_pendientes,
"acuse_descargados": acuse_descargados,
"acuses_pendientes": acuses_pendientes,
"acuses_pendientes": acuses_pendientes,
"edocs_cumplimiento": round(cumplimiento_edocs, 2),
"acuses_cumplimiento": round(cumplimiento_acuses, 2)
},
@@ -314,7 +325,7 @@ def dashboard_summary(request):
"partidas": {
"total": partidas_total,
"partidas_descargadas": partidas_descargadas,
"partidas_pendientes": partidas_pendientes,
"cumplimiento": round(cumplimiento_partidas, 2)
"partidas_pendientes": partidas_pendientes,
"cumplimiento": round(cumplimiento_partidas, 2)
}
})
})