You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
5.2 KiB
150 lines
5.2 KiB
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
|
|
|