from django.contrib.auth.decorators import login_required from django.http import HttpResponse import openpyxl import csv from django.template.loader import get_template from xhtml2pdf import pisa from django.shortcuts import render from .models import inventario @login_required def generar_reporte_pdf(request): # Obtener datos del inventario inventarios = inventario.objects.all() # Cargar la plantilla template = get_template('pdf.html') context = {'inventarios': inventarios} # Renderizar la plantilla a HTML html = template.render(context) # Crear un objeto de respuesta PDF response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'inline; filename="reporte.pdf"' # Convertir HTML a PDF pisa_status = pisa.CreatePDF(html, dest=response) if pisa_status.err: return HttpResponse(f'Error al generar PDF: {pisa_status.err}', status=500) return response @login_required def generar_reporte_excel(request): # Crear un nuevo libro de Excel wb = openpyxl.Workbook() ws = wb.active ws.title = 'Reporte de Inventario' # Encabezados headers = ['ID', 'Bodega', 'Artículo', 'Cantidad', 'Precio'] ws.append(headers) # Datos del inventario for item in inventario.objects.all(): ws.append([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad, item.precio]) # Configurar la respuesta HTTP response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; filename="reporte_inventario.xlsx"' # Guardar el archivo en la respuesta wb.save(response) return response @login_required def generar_reporte_csv(request): # Configurar la respuesta HTTP response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="reporte_inventario.csv"' writer = csv.writer(response) # Encabezados writer.writerow(['ID', 'Bodega', 'Artículo', 'Cantidad', 'Precio']) # Datos del inventario for item in inventario.objects.all(): writer.writerow([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad, item.precio]) return response @login_required def generar_grafico_chartjs(request): inventarios = inventario.objects.all() productos = [item.articulo.nombre_articulo for item in inventarios] cantidades = [item.cantidad for item in inventarios] return render(request, 'grafico_chartjs.html', { 'productos': productos, 'cantidades': cantidades, })