from django.contrib.auth.decorators import login_required from django.http import HttpResponse import openpyxl import csv from django.template.loader import get_template, render_to_string from xhtml2pdf import pisa from django.shortcuts import render from .models import inventario, movimiento_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'] 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]) # 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']) # Datos del inventario for item in inventario.objects.all(): writer.writerow([item.id, item.bodega.nombre_bodega, item.articulo.nombre_articulo, item.cantidad]) return response @login_required def generar_grafico_chartjs(request): # Obtener todos los inventarios inventarios = inventario.objects.all() # Extraer los productos, cantidades y medidas (suponiendo que cada producto tiene una medida asociada) productos = [item.articulo.nombre_articulo for item in inventarios] cantidades = [item.cantidad for item in inventarios] medidas = [item.articulo.medida for item in inventarios] # Asumiendo que cada 'articulo' tiene un atributo 'medida' # Pasar los datos a la plantilla return render(request, 'grafico_chartjs.html', { 'productos': productos, 'cantidades': cantidades, 'medidas': medidas, # Pasar las medidas también }) def reporte_excel(request): # Obtener todos los movimientos de inventario movimientos = movimiento_inventario.objects.all() # Crear la respuesta de archivo Excel response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; filename="reporte_inventario.xlsx"' # Crear el libro de Excel wb = openpyxl.Workbook() ws = wb.active ws.title = "Movimientos de Inventario" # Crear encabezados de columnas ws.append(['Fecha', 'Tipo de Movimiento', 'Bodega', 'Artículo', 'Cantidad', 'Observaciones']) # Agregar los datos for movimiento in movimientos: ws.append([movimiento.fecha, movimiento.tipo_inventario, movimiento.bodega, movimiento.articulo, movimiento.cantidad, movimiento.observaciones]) # Guardar el archivo Excel wb.save(response) return response def reporte_pdf(request): # Obtener todos los movimientos de inventario movimientos = movimiento_inventario.objects.all() # Renderizar la plantilla HTML html_string = render_to_string('reporte_pdf.html', {'movimientos': movimientos}) # Crear un objeto HttpResponse para el PDF response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="reporte_inventario.pdf"' # Convertir HTML a PDF usando xhtml2pdf pisa_status = pisa.CreatePDF(html_string, dest=response) if pisa_status.err: return HttpResponse('Error generando el PDF', status=500) return response def reporte_csv(request): # Obtener todos los movimientos de inventario movimientos = movimiento_inventario.objects.all() # Crear la respuesta de archivo CSV response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="reporte_inventario.csv"' # Crear el escritor de CSV writer = csv.writer(response) writer.writerow(['Fecha', 'Tipo de Movimiento', 'Bodega', 'Artículo', 'Cantidad', 'Observaciones']) # Escribir los datos for movimiento in movimientos: writer.writerow([movimiento.fecha, movimiento.tipo_inventario, movimiento.bodega, movimiento.articulo, movimiento.cantidad, movimiento.observaciones]) return response