168 lines
6.2 KiB
Python
168 lines
6.2 KiB
Python
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) |