from api.reports.models import ReportDocument from api.reports.tasks.report_document import generate_report_document, generate_report_control_pedimento from django.http import FileResponse from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response @api_view(['GET']) @permission_classes([IsAuthenticated]) def table_summary(request): """ Solo dispara la tarea asíncrona para generar el reporte CSV. No consulta ni procesa datos. """ org_id = request.query_params.get('organizacion_id') # hasta aqui si llega y crea el registro en la base de datos print(f'🖼️🖼️🖼️🖼️🖼️🖼️🖼️ table_summary organizacion id = {org_id}') if not org_id: return Response({"error": "organizacion_id es requerido"}, status=400) # Obtener filtros de query params tipo_documento = request.query_params.get('tipo_documento') rfc = request.query_params.get('contribuyente__rfc') fecha_pago_gte = request.query_params.get('fecha_pago__gte') fecha_pago_lte = request.query_params.get('fecha_pago__lte') patente = request.query_params.get('patente') aduana = request.query_params.get('aduana') pedimento = request.query_params.get('pedimento') pedimento_app = request.query_params.get('pedimento_app') regimen = request.query_params.get('regimen') tipo_operacion = request.query_params.get('tipo_operacion') filename_param = request.query_params.get('filename') if filename_param: filename = filename_param else: filename = None # Si no se proporcionan fechas, no las incluyas en los filtros if not fecha_pago_gte: fecha_pago_gte_str = None elif isinstance(fecha_pago_gte, str): fecha_pago_gte_str = fecha_pago_gte else: fecha_pago_gte_str = fecha_pago_gte.isoformat() if not fecha_pago_lte: fecha_pago_lte_str = None elif isinstance(fecha_pago_lte, str): fecha_pago_lte_str = fecha_pago_lte else: fecha_pago_lte_str = fecha_pago_lte.isoformat() filtros = { "organizacion_id": org_id, "tipo_documento": tipo_documento, "contribuyente__rfc": rfc, "fecha_pago__gte": fecha_pago_gte_str, "fecha_pago__lte": fecha_pago_lte_str, "patente": patente, "aduana": aduana, "pedimento": pedimento, "pedimento_app": pedimento_app, "regimen": regimen, "tipo_operacion": tipo_operacion, "filename": filename } report = ReportDocument.objects.create( user=request.user, filters=filtros, status='pending', report_type='cumplimiento' ) generate_report_document.delay(report.id) return Response({ "report_id": report.id, "status": report.status, "created_at": report.created_at, "download_url": report.file.url if report.file else None }, status=202) @api_view(['GET']) @permission_classes([IsAuthenticated]) def report_document_status(request, report_id): try: report = ReportDocument.objects.get(id=report_id, user=request.user) data = { "report_id": report.id, "status": report.status, "created_at": report.created_at, "finished_at": report.finished_at, "error_message": report.error_message, "download_url": report.file.url if report.file else None } return Response(data) except ReportDocument.DoesNotExist: return Response({"error": "Reporte no encontrado"}, status=404) @api_view(['GET']) @permission_classes([IsAuthenticated]) def report_document_list(request): reports = ReportDocument.objects.filter(user=request.user).order_by('-created_at') data = [ { "report_id": r.id, "report_type": r.report_type, "status": r.status, "created_at": r.created_at, "finished_at": r.finished_at, "error_message": r.error_message, "download_url": r.file.url if r.file else None } for r in reports ] return Response(data) @api_view(['GET']) @permission_classes([IsAuthenticated]) def report_document_download(request, report_id): try: report = ReportDocument.objects.get(id=report_id, user=request.user) if not report.file: return Response({"error": "El archivo aún no está disponible"}, status=404) response = FileResponse(report.file.open('rb'), as_attachment=True, filename=report.file.name) return response except ReportDocument.DoesNotExist: return Response({"error": "Reporte no encontrado"}, status=404) @api_view(['GET']) @permission_classes([IsAuthenticated]) def control_pedimento(request): """ Dispara la tarea asíncrona para generar el reporte CSV de control de Pedimentos. """ org_id = request.query_params.get('organizacion_id') if not org_id: return Response({"error": "organizacion_id es requerido"}, status=400) # Simplificar la lógica de fechas fecha_pago_gte = request.query_params.get('fecha_pago__gte') fecha_pago_lte = request.query_params.get('fecha_pago__lte') pedimento_app = request.query_params.get('pedimento_app') # Si las fechas vienen como string, mantenerlas como están fecha_pago_gte_str = fecha_pago_gte if fecha_pago_gte else None fecha_pago_lte_str = fecha_pago_lte if fecha_pago_lte else None filtros = { "pedimento_app": pedimento_app, "organizacion_id": org_id, "fecha_pago__gte": fecha_pago_gte_str, "fecha_pago__lte": fecha_pago_lte_str, } # Crear el reporte report = ReportDocument.objects.create( user=request.user, filters=filtros, status='pending', report_type='control_pedimento' ) # Disparar la tarea asíncrona generate_report_control_pedimento.delay(report.id) return Response({ "report_id": report.id, "status": report.status, "created_at": report.created_at, "message": "Reporte en proceso de generación", "download_url": report.file.url if report.file else None }, status=202)